gpt4 book ai didi

wpf - OnApplyTemplate 之前加载事件

转载 作者:行者123 更新时间:2023-12-01 16:13:11 25 4
gpt4 key购买 nike

我的印象是听 Loaded event将确保我当时可以访问可视化树。这在大多数情况下似乎工作得很好,视觉树正是我所期望的。但是,当使用TabControl时,隐藏选项卡上的控件在加载事件触发之前不会构建其视觉树。

举这个简单的例子:

<Window ...>
<Grid>
<TabControl>
<TabItem Header="Tab 1">
<my:MyTextBox />
</TabItem>
<TabItem Header="Tab 2">
<my:MyTextBox />
</TabItem>
</TabControl>
</Grid>
</Window>

MyTextBox 是一个自定义组件,仅在发生某些事件时注销。

public class MyTextBox : TextBox
{
public MyTextBox()
{
Loaded += (s,e) => {
Console.WriteLine("MyTextBox {0}: Loaded", s.GetHashCode());
Dispatcher.BeginInvoke(()=>Console.WriteLine("MyTextBox {0}: Loaded BeginInvoke", s.GetHashCode()));
};
}

public override void OnApplyTemplate()
{
base.OnApplyTemplate();
Console.WriteLine("MyTextBox {0}: OnApplyTemplate", this.GetHashCode());
}
}

这是输出:

MyTextBox A: OnApplyTemplate
MyTextBox A: Loaded
MyTextBox B: Loaded
MyTextBox A: Loaded BeginInvoke
MyTextBox B: Loaded BeginInvoke
(changing tab to 2)
MyTextBox B: OnApplyTemplate
MyTextBox B: Loaded
MyTextBox B: Loaded BeginInvoke

如您所见,对于位于第二个选项卡上的 B,仅当您切换到其选项卡时才会执行 OnApplyTemplate,但实际上会引发 returned 事件之前。

现在的问题是我的自定义组件是一个外观不明显的组件,它具有其控件模板集。在加载事件中,我现在想要浏览可视化树并应用一些额外的默认值,但由于模板尚未应用,可视化树是空的。

是否有某种方法,从外部(即不修改组件),确保我可以在加载可视化树后立即对其进行迭代?

最佳答案

TabControl 在底层进行了一些虚拟化。您可以按照此问题的答案禁用此功能: How to preserve control state within tab items in a TabControl

关于wpf - OnApplyTemplate 之前加载事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12620953/

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