wpf 加载控件时激发文本更改事件,是否需要防止加载?

xfb7svmp  于 2022-11-18  发布在  其他
关注(0)|答案(5)|浏览(169)

在中,我创建了一个控件,它有一个文本框和一个附加的文本更改事件处理程序-这是在XAML中。
问题在于:当加载控件时,将触发文本更改事件,我不希望在加载控件时仅当我通过键入内容在控件上实际更改文本时才发生此事件。
你的专业人士建议我怎么做?:)

pb3skfrl

pb3skfrl1#

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

xlpyo6sf

xlpyo6sf2#

将EventHandler附加在构造函数中的InitializeComponent方法之后,而不是Xaml中。
也就是说

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

我注意到你在谈论一个用户控件,我唯一能想到的就是创建一个属性,用来在父窗体完成加载之前禁止TextChanged事件。看看这样做是否有效。
主表单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
}
fxnxkyjh

fxnxkyjh3#

UserControl1.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的 Package
Window.xaml:

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

如您所见,您可以将eventHandler添加到事件 Package (TextBoxTextChanged)中
Window.xaml.cs:

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

最后,TextBoxValueChanged不会在第一次更改文本时触发

iecba09b

iecba09b4#

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"/>

(This是一个非常初级的、肮脏的、代码隐藏的黑客......检查布伦特所述的IsLoaded属性,我发现这是有效的)
此处,由于文本框控件创建时未获得焦点,因此将触发TextChanged事件,但未设置标志“1 ......”稍后,当用户在编辑字段后离开该字段时,由于该字段具有焦点,因此设置了标志......触发LostFocus,但仅在文本框发生更改时运行代码。

4szc88ey

4szc88ey5#

我找到了一种方法,可以在多个输入之间防止这种行为,而不必为每个输入创建唯一的bool ...

private void TextChanged_UpdateItem(object sender, TextChangedEventArg e)
{
    TextBox txtBox = sender as TextBox;
    if (!txtBox.IsFocused)
        return;

    //The rest of your code here
    
}

因此,基本上,如果文本字段没有焦点(如初始化时),它就返回。这也防止了它在其他地方更改数据时触发。:)

或者,如布伦特所述,您可以只查找“IsLoaded”:

private void TextChanged_UpdateItem(object sender, TextChangedEventArg e)
{
    TextBox txtBox = sender as TextBox;
    if (!txtBox.IsLoaded)
        return;

    //The rest of your code here
    
}

相关问题