제가 TextBox를 이용해서 유닉스 시간값 같은걸 받아오고있었는데
예시)12:00:00
TextBox로 하다보니 시간을 수정할 때 : 같은 문자가 지워질수밖에 없더라구요.
혹시 지워지지 않게 하는 방법이 있을까요?
나중에는 시간뿐만이 아니라 다른 값도 넣을 때 사용하려고 합니다.
제가 TextBox를 이용해서 유닉스 시간값 같은걸 받아오고있었는데
예시)12:00:00
TextBox로 하다보니 시간을 수정할 때 : 같은 문자가 지워질수밖에 없더라구요.
혹시 지워지지 않게 하는 방법이 있을까요?
나중에는 시간뿐만이 아니라 다른 값도 넣을 때 사용하려고 합니다.
TextBox 대신 MaskedTextBox 한번 봐보세요~
MaskedTextBox를 사용하려면 Extended.Wpf.Toolkit Nuget패키지를 다운받아야 한다는데 맞나요? Nuget패키지는 마소꺼 제외하고는 못쓰는지라…
개발 제약이있으신건가요?
아님 사용하는데 어려움이 있다는 말씀이신가요???
개발에 제약이 있는지라…
제약이 있으면 직접 구현하실 수 밖에요.,
기능이 단순하여 약간의 LLM AI Chat 기능을 이용하셔도 좋습니다.
(다만 어느 정도 지식이 있는 상태에서 보조수단으로 사용 하시는 것이 좋습니다.)
다음은 제가 AI에게 부탁해서 AI가 만들어낸 시간포맷 형식의 커스텀 컨트롤 입니다.
이렇게 요청 하였더니 다음과 같이 뚝딱 만들어 냈습니다.
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
public class TimeInputTextBox : TextBox
{
public TimeInputTextBox()
{
this.Text = "00:00:00";
this.MaxLength = 8;
this.TextAlignment = TextAlignment.Center;
}
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
base.OnPreviewTextInput(e);
if (!IsValidTimeInput(e.Text))
{
e.Handled = true;
return;
}
string newText = GetNewText(this.Text, this.SelectionStart, this.SelectionLength, e.Text);
if (IsValidTimeFormat(newText))
{
this.Text = newText;
this.CaretIndex = this.SelectionStart + 1;
e.Handled = true;
}
else
{
e.Handled = true;
}
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (e.Key == Key.Space)
{
e.Handled = true;
}
else if (e.Key == Key.Back)
{
int caretIndex = this.CaretIndex;
if (caretIndex > 0 && (caretIndex == 3 || caretIndex == 6))
{
this.Text = this.Text.Remove(caretIndex - 2, 2).Insert(caretIndex - 2, "00");
this.CaretIndex = caretIndex - 1;
}
else if (caretIndex > 0)
{
this.Text = this.Text.Remove(caretIndex - 1, 1).Insert(caretIndex - 1, "0");
this.CaretIndex = caretIndex - 1;
}
e.Handled = true;
}
}
private bool IsValidTimeInput(string input)
{
return int.TryParse(input, out _);
}
private bool IsValidTimeFormat(string timeString)
{
if (timeString.Length != 8)
return false;
if (timeString[2] != ':' || timeString[5] != ':')
return false;
if (!int.TryParse(timeString.Substring(0, 2), out int hours) || hours > 23)
return false;
if (!int.TryParse(timeString.Substring(3, 2), out int minutes) || minutes > 59)
return false;
if (!int.TryParse(timeString.Substring(6, 2), out int seconds) || seconds > 59)
return false;
return true;
}
private string GetNewText(string currentText, int selectionStart, int selectionLength, string input)
{
string newText = currentText.Remove(selectionStart, selectionLength).Insert(selectionStart, input);
return newText;
}
}
그런데 어느 정도 괜찮은듯 한데 유효성 체크 하는 부분이 약간 비효율적인거 같습니다.
그래서 다음과 같이 다시 요청 했습니다.
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
public class TimeInputTextBox : TextBox
{
public TimeInputTextBox()
{
this.Text = "00:00:00";
this.MaxLength = 8;
this.TextAlignment = TextAlignment.Center;
}
protected override void OnPreviewTextInput(TextCompositionEventArgs e)
{
base.OnPreviewTextInput(e);
if (!IsValidTimeInput(e.Text))
{
e.Handled = true;
return;
}
string newText = GetNewText(this.Text, this.SelectionStart, this.SelectionLength, e.Text);
if (IsValidTimeFormat(newText))
{
this.Text = newText;
this.CaretIndex = this.SelectionStart + 1;
e.Handled = true;
}
else
{
e.Handled = true;
}
}
protected override void OnPreviewKeyDown(KeyEventArgs e)
{
base.OnPreviewKeyDown(e);
if (e.Key == Key.Space)
{
e.Handled = true;
}
else if (e.Key == Key.Back)
{
int caretIndex = this.CaretIndex;
if (caretIndex > 0 && (caretIndex == 3 || caretIndex == 6))
{
this.Text = this.Text.Remove(caretIndex - 2, 2).Insert(caretIndex - 2, "00");
this.CaretIndex = caretIndex - 1;
}
else if (caretIndex > 0)
{
this.Text = this.Text.Remove(caretIndex - 1, 1).Insert(caretIndex - 1, "0");
this.CaretIndex = caretIndex - 1;
}
e.Handled = true;
}
}
private bool IsValidTimeInput(string input)
{
return int.TryParse(input, out _);
}
private bool IsValidTimeFormat(string timeString)
{
return DateTime.TryParseExact(timeString, "HH:mm:ss", CultureInfo.InvariantCulture, DateTimeStyles.None, out _);
}
private string GetNewText(string currentText, int selectionStart, int selectionLength, string input)
{
string newText = currentText.Remove(selectionStart, selectionLength).Insert(selectionStart, input);
return newText;
}
}
어떠신가요 ?
감사합니다! 출장 복귀하면 해봐야겠네요