gpt4 book ai didi

c# - 需要更多地控制文本框的 MouseDown 和 KeyDown

转载 作者:太空宇宙 更新时间:2023-11-03 14:00:50 25 4
gpt4 key购买 nike

标题只是有些准确。我正在尝试用文本框做一些特别的事情,并且缺少某些事件触发会造成一些麻烦,但我也想要一些关于如何做我想在这里做的事情的一般性建议。我正在尝试重新创建一个存在于旧访问应用程序中的特殊文本框。用于输入社会安全号码,空白时显示___-__-____

当您单击任何空格时,它会突出显示特定字符​​。如果您输入一个数字,它会将 _ 替换为该数字。如果您点击删除或退格键,它只会用 _ 或 - 替换任何突出显示的字符,具体取决于。

我可以通过使用只读文本框并触发 PreviewMouseUp 事件来调用突出显示当前光标位置的方法来重新创建它。但是因为它是只读的,所以它不会触发任何 KeyUp 或 KeyDown 事件来改变选择。如果我在主 UI 网格中放置一个 KeyUp,我可以做到这一点,但它只适用于 KeyUp,所以它最终看起来非常迟钝。 PreviewMouseUp 也有同样的问题,我希望它在按下鼠标而不是按下鼠标时突出显示,但 PreviewMouseDown 什么也没触发。

我觉得我正在以越来越困惑的方式处理这件事。我已经描述了我想要的东西,有没有人对如何完成这个不是 super 复杂的事情有更好的想法?我想让文本框保持只读状态,以允许我手动处理按键输入。我的意思是,我原来的格式化方式是简单地在 KeyUp 上运行一个方法,它检查你添加的内容的长度并适本地格式化它(添加破折号等),但是这会导致这一刻一切看起来都没有格式化,直到你释放 key 。例如,如果我在文本框中间按下“2”,它会将所有破折号移动一个字符,直到松开“2”按钮,然后格式固定。

想法?

最佳答案

有趣的是,我为此工作了多长时间才终于得到它,但关键在 AddHandler 中。对于那些想要这样的文本框的人,我是这样做的。这里有一些乱七八糟的地方,这些只是为了重新创建访问文本框的确切功能。最烦人的部分是实现退格按钮,因为它会删除所选部分之前的内容。另外,请确保您的文本框是 IsReadOnly。

在构造函数中放置:

textBox_ssn.AddHandler(Control.MouseDownEvent, new MouseButtonEventHandler(ClickSS), true);
textBox_ssn.AddHandler(Control.KeyDownEvent, new KeyEventHandler(ButtonSS), true);

然后使用这两种方法:

public void ClickSS(object sender, EventArgs e)
{
textBox_ssn.SelectionLength = 1;
}

public void ButtonSS(object sender, KeyEventArgs e)
{
bool on_first_char = false;
if (textBox_ssn.SelectionStart == 0) on_first_char = true;

if (e.Key == Key.Right && textBox_ssn.SelectionStart < 10)
{
++textBox_ssn.SelectionStart;
textBox_ssn.SelectionLength = 1; //Without this, it will move around large blocks of selection
if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
}
else if (e.Key == Key.Left && textBox_ssn.SelectionStart > 0)
{
--textBox_ssn.SelectionStart;
textBox_ssn.SelectionLength = 1;
if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
}
else
{
string temp = "";
switch (e.Key)
{
case Key.D0:
temp = "0";
break;
case Key.D1:
temp = "1";
break;
case Key.D2:
temp = "2";
break;
case Key.D3:
temp = "3";
break;
case Key.D4:
temp = "4";
break;
case Key.D5:
temp = "5";
break;
case Key.D6:
temp = "6";
break;
case Key.D7:
temp = "7";
break;
case Key.D8:
temp = "8";
break;
case Key.D9:
temp = "9";
break;
case Key.Delete:
temp = "_";
break;
case Key.Back:
temp = "_";
if (textBox_ssn.SelectionStart > 0) --textBox_ssn.SelectionStart;
if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
//else return; //or could do temp = selection text but only if selection length is 1 ectect
break;
}

if (temp != "")
{
if (textBox_ssn.SelectionLength > 1)
{
string underscores = "";

foreach (char c in textBox_ssn.SelectedText)
{
if (c == '-') underscores += "-";
else underscores += "_";
}

textBox_ssn.SelectedText = underscores;
textBox_ssn.SelectionLength = 1;
}

if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
if (textBox_ssn.SelectionLength == 1)
{
if (!(on_first_char && e.Key == Key.Back)) textBox_ssn.SelectedText = temp;

if (e.Key == Key.Delete) ;
else if (e.Key == Key.Back)
{
if (textBox_ssn.SelectionStart > 0)
{
//--textBox_ssn.SelectionStart;
if (textBox_ssn.SelectedText == "-") --textBox_ssn.SelectionStart;
}
}
else
{
++textBox_ssn.SelectionStart;
if (textBox_ssn.SelectedText == "-") ++textBox_ssn.SelectionStart;
}
}
}
}
}

关于c# - 需要更多地控制文本框的 MouseDown 和 KeyDown,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10750574/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com