public UserControl1()
{
InitializeComponent();
textBox1.TextChanged += new TextChangedEventHandler(textBox1_TextChanged);
}
public string setText
{
get { return textBox1.Text; }
set { textBox1.Text = value; }
}
public bool setInhibit { get; set; }
void textBox1_TextChanged(object sender, TextChangedEventArgs e)
{
if (setInhibit) return;
// Do your work here
}
private void TextChanged_UpdateItem(object sender, TextChangedEventArg e)
{
TextBox txtBox = sender as TextBox;
if (!txtBox.IsFocused)
return;
//The rest of your code here
}
private void TextChanged_UpdateItem(object sender, TextChangedEventArg e)
{
TextBox txtBox = sender as TextBox;
if (!txtBox.IsLoaded)
return;
//The rest of your code here
}
5条答案
按热度按时间pb3skfrl1#
您所要做的就是在处理文本框之前,在事件处理程序中检查它的IsLoaded属性。
xlpyo6sf2#
将EventHandler附加在构造函数中的
InitializeComponent
方法之后,而不是Xaml
中。也就是说
我注意到你在谈论一个用户控件,我唯一能想到的就是创建一个属性,用来在父窗体完成加载之前禁止TextChanged事件。看看这样做是否有效。
主表单Xaml:
主表单CS
使用者控件:
fxnxkyjh3#
UserControl1.xaml:
其中TextChanged是TextBox的原始事件
UserControl1.xaml.cs:
其中TextBox_TextChanged是原始TextChanged的自定义事件处理程序,而TextBoxTextChanged更像是原始TextChanged的 Package
Window.xaml:
如您所见,您可以将eventHandler添加到事件 Package (TextBoxTextChanged)中
Window.xaml.cs:
最后,TextBoxValueChanged不会在第一次更改文本时触发
iecba09b4#
在您的XAML上:
(This是一个非常初级的、肮脏的、代码隐藏的黑客......检查布伦特所述的IsLoaded属性,我发现这是有效的)
此处,由于文本框控件创建时未获得焦点,因此将触发TextChanged事件,但未设置标志“1 ......”稍后,当用户在编辑字段后离开该字段时,由于该字段具有焦点,因此设置了标志......触发LostFocus,但仅在文本框发生更改时运行代码。
4szc88ey5#
我找到了一种方法,可以在多个输入之间防止这种行为,而不必为每个输入创建唯一的bool ...
因此,基本上,如果文本字段没有焦点(如初始化时),它就返回。这也防止了它在其他地方更改数据时触发。:)
或者,如布伦特所述,您可以只查找“IsLoaded”: