【问题标题】:Given a styled WPF DependencyObject, how can I get the Style Key in code?给定一个样式化的 WPF DependencyObject,我如何在代码中获取样式键?
【发布时间】:2009-11-02 10:59:39
【问题描述】:

我有一组绑定到数据的控件,我想在这些控件上以编程方式将验证器添加到绑定中。目前,我能够遍历可视化树以找到具有绑定的控件,并将我的验证器添加到这些控件中。但是为了进一步指定哪些控件应该具有特定的验证,我想使用样式。所以我的 XAML 看起来像这样:

<TextBox Name="someTextBox" Style="{StaticResource optionalNumericTextBox}" />

在这里,optionalNumericTextBox 样式既可以添加验证错误模板,也可以作为装饰器来指示此文本框应该应用可选的数字验证器。

当我遍历可视化树,发现带有绑定的控件,然后需要确定使用的样式时,就会出现问题。目前我已经尝试过

dependencyObject.GetValue(FrameworkElement.StyleProperty)

这给了我a Style 对象,但据我所知,这个对象不携带 “可选数字文本框”值。是否甚至可以确定密钥,或者此信息是否会在 XAML 阅读器中丢失?

【问题讨论】:

    标签: wpf styles dependencyobject


    【解决方案1】:

    使用 StaticResourceExtension 时,在将 XAML 转换为 BAML 时,此信息会在编译时丢失。另一方面,使用DynamicResourceExtension 可以保留密钥,以便可以在运行时解析资源。要获取密钥,您需要使用ReadLocalValue()

    //this gets the Style
    var s = textbox.GetValue(TextBox.StyleProperty);
    //this gets a ResourceReferenceExpression
    var l = textbox.ReadLocalValue(TextBox.StyleProperty);
    

    问题是,ResourceReferenceExpression 是一个内部类型,所以你需要使用反射来提取密钥。

    作为所有这些的替代方案,您是否考虑过劫持Tag 属性?

    <Style x:Key="optionalNumericTextBox" TargetType="TextBox">
        <Setter Property="Tag" Value="optionalNumericTextBox"/>
    </Style>
    

    然后您的代码可以简单地检查TextBox 上的Tag 属性。

    【讨论】:

    • 很好的提示,使用属性设置器。实际上向我指出了使用附加属性而不是标签的方向。所以现在我使用类似的东西: 就像一个魅力!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多