【问题标题】:How to determine when a WPF User Control has completed loading如何确定 WPF 用户控件何时完成加载
【发布时间】:2011-07-25 18:53:48
【问题描述】:

我有一个带有多个文本框和组合框的 UIElement Grid 的 WPF 用户控件。我有一个 Button(btnApply),当表单完成加载时,其 IsEnabled 状态应该为 false。但是,在填充网格并将 IsEnabled 更改为 true 时,会触发 TextChanged 事件。我添加了一个布尔方法,在用户控件完成加载后保持 btnApply.IsEnabled = false 。但是,我无法判断用户控件何时完全完成加载以更改我的方法的布尔状态以允许更改 btnApply.IsEnabled。我已经在用户控件上尝试了 Loaded 事件并尝试检查 IsLoaded 事件,它们都在用户控件上的所有元素完成加载之前被触发。

编辑:用户控件的 UIElement Grid 通过 ItemsSource = List 填充。文本框和组合框的更改通过 TextChanged 和 SelectionChanged 事件进行捕获。

【问题讨论】:

  • 是什么触发了 TextChanged 事件?

标签: c# wpf .net-3.5


【解决方案1】:

尝试使用 Dispatcher 在 DispatcherPriority 比 Loaded 之后触发 IsEnabled 更改,例如 Input。

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

您可以查看DispatcherPriority订单here

【讨论】:

  • 瑞秋,我喜欢这个主意。我认为这意味着我可以将 IsEnabled 属性更改为仅在用户控件完成加载后触发,即枚举值 5(输入)。只是,它不起作用。这是我的代表 - public delegate void MyApplyDelegate();我在 InitializeComponent(); 之后添加了这个btnApply.Dispatcher.BeginInvoke(DispatcherPriority.Input, new Action(delegate() { btnApply.IsEnabled = false; }));
  • @GAR8 在你的控件加载过程中发生了什么,需要这么长时间?您确定问题是 Loaded 事件尚未完成吗?也许您可以发布更多代码。
  • 我让它工作了,做了以下更改 btnApply.Dispatcher.BeginInvoke(DispatcherPriority.Input, new MyApplyDelegate(delegate() { btnApply.IsEnabled = false; }));
  • 还发现 this 更有帮助,因为它包含了委托的使用。
【解决方案2】:

也许我误解了这个问题,但是在 UserControl 上注册 Initialized / Loaded 并不能解决问题?如果没有,您如何填充网格?

【讨论】:

  • 在网格完全填充之前更正初始化和加载触发器。我有一个在加载网格时触发的 TextChanged 事件。但是,我放置了一个停止 TextChanged 事件的布尔方法。现在我不知道用户控件和网格何时完全完成加载以关闭我的方法(即 TRUE),因此 TextChanged 事件将知道可以触发。当然,我的方法不需要成为解决方案的一部分。它仅被设置为保持 btnApply.IsEnable 的默认状态等于 false 的一种方式。
猜你喜欢
  • 1970-01-01
  • 2011-08-01
  • 2013-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-10-07
  • 1970-01-01
相关资源
最近更新 更多