我知道从控件的构造函数完成后,使用FindResource方法获取资源将无效,因为它将始终返回null。
public class MyButton : Button
{
public MyButton()
{
Style = FindResource("myStyle") as Style;
}
}
我知道可以通过OnApplyTemplate方法完成。
public override void OnApplyTemplate()
{
Style = FindResource("myStyle") as Style;
base.OnApplyTemplate();
}
为什么?我认为这与VisualTree的加载有关,但我希望从您的WPF专家那里获得更详细,准确的答案(或者只是一个正确的答案,以防万一,我完全不在这里)。
因为查找资源最多涉及遍历逻辑元素树(以查找与祖先关联的资源)或查看Resources
当前元素的资源。
在这两种情况下,除非Parent
或Resources
已经分别设置为“正确”值,否则这是不可能的。这些是属性,并且XAML序列化引擎会在构造函数运行后对其进行设置。也就是说,当你写
<Button Height="80" Width="150" />
XAML反序列化器最终完成了与
var button = new Button(); // element is instantiated
button.Height = 80; // ...and THEN properties are set
button.Width = 150;
因此,您不能在构造函数内部执行任何操作,该操作取决于所设置的属性。
为了证实上述观点,请参考以下文档FindResource
:
如果在调用元素上找不到资源,则接下来搜索逻辑树中的父元素,然后搜索应用程序,主题,最后是系统资源。此查找方法与标记中的动态资源引用请求资源时如何搜索树相同。
遍历逻辑树当然是通过Parent
属性完成的。这很直观,但在文档中也清楚地说明了LogicalTreeHelper.GetParent
:
此方法只是一个包装,它获取or属性的适当类型版本(
FrameworkElement
或FrameworkContentElement
);因此,除非无法确定当前类型,否则您可能需要检查各自的实例属性。FrameworkElement.Parent
FrameworkContentElement.Parent
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句