如何确定WPF用户控件何时完成加载

6
我有一个包含多个文本框和组合框的UIElement网格的WPF用户控件。我有一个名为btnApply的按钮,其IsEnabled状态在表单加载完成时应为false。但是,当网格正在填充时,TextChanged事件会触发并将IsEnabled更改为true。我添加了一个布尔方法,在用户控件完成加载后保持btnApply.IsEnabled = false。但是,我无法确定用户控件何时完全加载完成,以更改我的方法的布尔状态,以允许更改btnApply.IsEnabled。我尝试过在用户控件上使用Loaded事件和检查IsLoaded事件,它们都在用户控件上的所有元素完成加载之前触发。
编辑:用户控件的UIElement网格通过ItemsSource = List进行填充。文本框和组合框更改通过TextChanged和SelectionChanged事件捕获。

触发TextChanged事件的是什么? - Ed Bayiates
2个回答

6

尝试使用Dispatcher在比Loaded更晚的DispatcherPriority(如Input)触发IsEnabled更改。

Dispatcher.BeginInvoke(DispatcherPriority.Input,
    new Action(delegate() { btnApply.IsEnabled = false; } ));

You can view the DispatcherPriority order here


Rachel,我喜欢这个想法。我认为它意味着我可以将IsEnabled属性更改为仅在用户控件完成加载后触发,即枚举值5(输入)。只是,它不起作用。这是我的委托 - public delegate void MyApplyDelegate(); 我在我的InitializeComponent()之后添加了这个 - btnApply.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(delegate() { btnApply.IsEnabled = false; })); - GAR8
@GAR8 在你的控件加载过程中发生了什么导致花费了这么长时间?你确定问题是 Loaded 事件还没有完成吗?也许你可以发布更多的代码。 - Rachel
我已经让它起作用并进行了以下更改:btnApply.Dispatcher.BeginInvoke(DispatcherPriority.Input,new MyApplyDelegate(delegate(){btnApply.IsEnabled = false; })); - GAR8
我还发现这个链接更有帮助,因为它包括了委托的使用。 - GAR8

0

也许我误解了问题,但在UserControl上注册Initialized / Loaded是否行得通?如果不行,那你是如何填充Grid的呢?


在网格完全填充之前,正确初始化和加载触发器。我有一个TextChanged事件在网格加载时被触发。然而,我放置了一个布尔方法来停止TextChanged事件。现在,我不知道用户控件和网格何时完成加载,以便关闭我的方法(即TRUE),使TextChanged事件知道可以触发它是安全的。尽管我的方法不需要成为解决方案的一部分。但它仅被设置为使btnApply.IsEnable的默认状态等于false的方式。 - GAR8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接