0

在我创建了一个控件,该控件具有一个文本框和一个附加到它的文本更改事件处理程序 - 这是在 xaml 中。

问题:当控件被加载时,文本更改事件被触发,我不希望它在控件加载时发生,只有当我通过键入某些内容来使其实际更改控件时才发生。

你的专业人士建议我做什么?:)

4

4 回答 4

6

您所要做的就是在处理之前检查事件处理程序中文本框的 IsLoaded 属性。

于 2016-02-12T16:10:33.610 回答
0

用户控件1.xaml:

<Grid>
    <TextBox Text="{Binding MyText, UpdateSourceTrigger=PropertyChanged}" TextChanged="TextBox_TextChanged"/>
</Grid>

其中 TextChanged 是 TextBox 的原始事件

UserControl1.xaml.cs:

public partial class UserControl1 : UserControl
{
    public UserControl1()
    {
        _isFirstTime = true;
        DataContext = this;
        InitializeComponent();
    }

    public event TextChangedEventHandler TextBoxTextChanged;
    bool _isFirstTime;

    //MyText Dependency Property
    public string MyText
    {
        get { return (string)GetValue(MyTextProperty); }
        set { SetValue(MyTextProperty, value); }
    }
    public static readonly DependencyProperty MyTextProperty =
        DependencyProperty.Register("MyText", typeof(string), typeof(UserControl1), new UIPropertyMetadata(""));

    private void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        if (TextBoxTextChanged != null)
            if (!_isFirstTime)
            {
                TextBoxTextChanged(sender, e);
            }
        _isFirstTime = false;
    }
}

其中 TextBox_TextChanged 是原始 TextChanged 的​​自定义事件处理程序,而 TextBoxTextChanged 更像是原始 TextChanged 的​​包装器

窗口.xaml:

<Grid>
    <c:UserControl1 TextBoxTextChanged="TextBoxValueChanged"/>
</Grid>

如您所见,您可以将 eventHandler 添加到事件包装器(TextBoxTextChanged)

Window.xaml.cs:

private void TextBoxValueChanged(object sender, TextChangedEventArgs e)
{
    MessageBox.Show("asd");
}

最后 TextBoxValueChanged 在第一次更改 Text 时不会被触发

于 2012-10-13T19:01:00.710 回答
0

在构造函数中的方法之后附加您的 EventHandler,而InitializeComponent不是在Xaml.

IE

public MainWindow()
{
    InitializeComponent();
    textBox1.TextChanged+=new TextChangedEventHandler(textBox1_TextChanged);
}

我注意到您在谈论用户控件,我唯一能想到的就是创建一个可用于在父窗体完成加载之前禁止 TextChanged 事件的属性。看看这样的事情是否有效。

MainForm Xaml:

<my:UserControl1 setInhibit="True"   HorizontalAlignment="Left" Margin="111,103,0,0" x:Name="userControl11" VerticalAlignment="Top" Height="55" Width="149" setText="Hello" />

主窗体 CS

private void Window_Loaded(object sender, RoutedEventArgs e)
{
    userControl11.setInhibit = false;
}

用户控制:

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
}
于 2012-10-13T12:08:40.963 回答
0
private void TextBoxValueChanged(object sender, TextChangedEventArgs e)
    {
        if (Textbox1.IsFocused)
        {
            App.Current.Properties["TextChanged"] = "1"; // Set Flag
        }            
    }

private void TextBoxLostFocus(object sender, RoutedEventArgs e)
    {            
       if (App.Current.Properties["TextChanged"] == "1")
        {
            // Do Your Wor Here
            App.Current.Properties["TextChanged"] = "0"; // Clear Flag
        }
    }

在您的 XAML 上:

<TextBox xName="TextBox1" LostFocus="TextBoxLostFocus" TextChanged="TextBoxValueChanged"/>

在这里,由于在创建文本框控件时它没有聚焦,因此 TextChanged 事件将触发,但未设置标志“1”...稍后当用户在编辑后离开字段时,因为它具有焦点,所以设置了标志... LostFocus 是触发,但仅在文本框更改时才运行代码。

于 2021-09-22T01:57:21.850 回答