为什么无法在控件的构造函数中获取资源

奥姆里·布蒂安(Omri Btian)

背景

我知道从控件的构造函数完成后,使用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当前元素的资源。

在这两种情况下,除非ParentResources已经分别设置为“正确”值,否则这是不可能的这些是属性,并且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属性的适当类型版本(FrameworkElementFrameworkContentElement因此,除非无法确定当前类型,否则您可能需要检查各自的实例属性。FrameworkElement.ParentFrameworkContentElement.Parent

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Monkeypatch无法在构造函数中识别出赋值?

来自分类Dev

为什么HyperLink控件无法获取url?

来自分类Dev

为什么自定义WinForms控件在绘制时不遵守构造函数中设置的属性?

来自分类Dev

为什么复制构造函数无法“复制”

来自分类Dev

为什么无法在函数中获取Shell脚本的参数计数

来自分类Dev

为什么我的函数无法从提取中获取结果?

来自分类Dev

为什么在OOP中需要构造函数?

来自分类Dev

无法在构造函数中获取会话

来自分类Dev

为什么我在扩展jna中的Structure的类构造函数中获取NullPointerException?

来自分类Dev

ArrayAdapter构造函数中的id参数是什么资源?

来自分类Dev

ArrayAdapter构造函数中的id参数是什么资源?

来自分类常见问题

为什么Java编译器在构造函数实例化中无法跟踪泛型类型?

来自分类Dev

为什么在C#构造函数中无法同时使用:base()和:this()

来自分类Dev

为什么在C ++中我无法使用参数化构造函数声明动态对象数组?

来自分类Dev

为什么在Dart的null安全中无法访问List()构造函数?

来自分类Dev

为什么在C#构造函数中无法同时使用:base()和:this()

来自分类Dev

为什么我无法在组件的构造函数中访问模板 DOM 元素

来自分类Dev

为什么ReSharper的ContractAnnotationAttribute无法定位到构造函数?

来自分类Dev

为什么无法识别我的类型构造函数

来自分类Dev

为什么构造函数无法推断出模板参数?

来自分类Dev

为什么我的公共void构造函数{}无法编译?

来自分类Dev

为什么QAudioRecorder无法通过构造函数录制?

来自分类Dev

为什么ReSharper的ContractAnnotationAttribute无法定位到构造函数?

来自分类Dev

为什么我的构造函数无法正常工作?

来自分类Dev

为什么需要在构造函数中绑定函数

来自分类Dev

为什么在拥有私有构造函数时无法调用默认构造函数?

来自分类Dev

为什么在拥有私有构造函数时无法调用默认构造函数?

来自分类Dev

由于数据类型中的某些错误,我的构造函数无法正常工作,我无法弄清为什么

来自分类Dev

由于数据类型中的某些错误,我的构造函数无法正常工作,我无法弄清为什么

Related 相关文章

  1. 1

    为什么Monkeypatch无法在构造函数中识别出赋值?

  2. 2

    为什么HyperLink控件无法获取url?

  3. 3

    为什么自定义WinForms控件在绘制时不遵守构造函数中设置的属性?

  4. 4

    为什么复制构造函数无法“复制”

  5. 5

    为什么无法在函数中获取Shell脚本的参数计数

  6. 6

    为什么我的函数无法从提取中获取结果?

  7. 7

    为什么在OOP中需要构造函数?

  8. 8

    无法在构造函数中获取会话

  9. 9

    为什么我在扩展jna中的Structure的类构造函数中获取NullPointerException?

  10. 10

    ArrayAdapter构造函数中的id参数是什么资源?

  11. 11

    ArrayAdapter构造函数中的id参数是什么资源?

  12. 12

    为什么Java编译器在构造函数实例化中无法跟踪泛型类型?

  13. 13

    为什么在C#构造函数中无法同时使用:base()和:this()

  14. 14

    为什么在C ++中我无法使用参数化构造函数声明动态对象数组?

  15. 15

    为什么在Dart的null安全中无法访问List()构造函数?

  16. 16

    为什么在C#构造函数中无法同时使用:base()和:this()

  17. 17

    为什么我无法在组件的构造函数中访问模板 DOM 元素

  18. 18

    为什么ReSharper的ContractAnnotationAttribute无法定位到构造函数?

  19. 19

    为什么无法识别我的类型构造函数

  20. 20

    为什么构造函数无法推断出模板参数?

  21. 21

    为什么我的公共void构造函数{}无法编译?

  22. 22

    为什么QAudioRecorder无法通过构造函数录制?

  23. 23

    为什么ReSharper的ContractAnnotationAttribute无法定位到构造函数?

  24. 24

    为什么我的构造函数无法正常工作?

  25. 25

    为什么需要在构造函数中绑定函数

  26. 26

    为什么在拥有私有构造函数时无法调用默认构造函数?

  27. 27

    为什么在拥有私有构造函数时无法调用默认构造函数?

  28. 28

    由于数据类型中的某些错误,我的构造函数无法正常工作,我无法弄清为什么

  29. 29

    由于数据类型中的某些错误,我的构造函数无法正常工作,我无法弄清为什么

热门标签

归档