gpt4 book ai didi

c# - 加载新的 WPF/C# 窗口时触发的最后一个事件是什么?

转载 作者:IT王子 更新时间:2023-10-29 04:40:05 25 4
gpt4 key购买 nike

我正在尝试为我的应用程序加载首选项窗口,我希望应用按钮最初被禁用,然后当首选项更新时,应用按钮再次启用。我有一些控件数据绑定(bind)到首选项对象,发生的事情是窗口加载后,组合框事件被触发。有没有什么事件可以保证在一切都稳定后最后发生?

我的代码如下所示(应用按钮在窗口加载后始终处于启用状态):

private void Window_Loaded(object sender, RoutedEventArgs e)
{
_preferencesData = new PreferencesDataContext();
LayoutRoot.DataContext = _preferencesData;
ButtonApply.IsEnabled = false;
}

private void ComboBox_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
{
ButtonApply.IsEnabled = true;
}

有趣的是,这只发生在文本框和组合框上,而不是复选框或单选按钮。

最佳答案

满足简单需求的最佳解决方案

Joseph 的回答是迄今为止满足您简单需求的最佳解决方案:只需使用数据绑定(bind)并让数据模型处理它。

对问题的回答

当一切都已完成加载并且所有事件都已触发后,您确实确实需要控制时,情况会更加复杂。没有一个事件“最后死了”,但是使用 Dispatcher 队列很容易有效地滚动你自己的事件。

这是怎么做的:

Dispatcher.BeginInvoke(DispatcherPriority.ContextIdle, new Action(() =>
{
var x = ComputeSomething(1, 2, 3);
DoSomething(x, "Test");
}));

当 WPF 以比 ContextIdle 更高的优先级完成所有操作时,{ } 内的所有操作都会执行,其中包括所有事件处理程序、加载事件、输入事件、渲染等。

创建和显示窗口时的事件序列

根据要求,这是创建和显示窗口时 WPF 中主要事件的顺序:

  1. 构造函数和 getter/setter 在创建对象时被调用,包括正在更新的对象和从它们继承的任何对象的 PropertyChangedCallback、ValidationCallback 等

  2. 当每个元素被添加到可视化或逻辑树时,它的 Initialized 事件被触发,这导致除了您可以定义的任何特定于元素的初始化之外应用样式和触发器 [注意:未触发初始化事件如果根部没有 PresentationSource(例如 Window),用于逻辑树中的叶子]

  3. 窗口及其上的所有非折叠视觉对象都被测量,这会在每个控件上产生一个 ApplyTemplate,这会导致额外的对象树构造,包括更多的构造函数和 getters/setters

  4. 窗口及其上所有未折叠的视觉对象均已排列

  5. 窗口及其后代(逻辑的和可视的)接收一个 Loaded 事件

  6. 任何在首次设置时失败的数据绑定(bind)都会重试

  7. 窗口及其后代有机会以可视方式呈现其内容

步骤 1-2 在创建窗口时完成,无论它是否显示。其他步骤通常在显示窗口之前不会发生,但如果手动触发,它们可能会更早发生。

关于c# - 加载新的 WPF/C# 窗口时触发的最后一个事件是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1744757/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com