如何在C#中读取Windows.UI.XAML.Style属性

4
我正在编写一个类,它将把HTML文档转换成可以在Windows 8应用程序中与RichTextBlock一起使用的段落列表。我希望能够向该类提供在XAML中定义的样式列表,并且该类将从样式中读取有用的属性并应用它们。
如果我有一个Windows.UI.XAML.Style style,我如何从中读取属性?我尝试过:
var fontWeight = style.GetValue(TextElement.FontWeightProperty)

在XAML中定义了一个style,其中TargetProperty="TextBlock",但是会出现异常。


这并不是直接回答问题,但是你实际上需要在将样式应用于解析文本时阅读样式吗?我想你会使用键控样式根据HTML中的格式应用于文本范围。 - Filip Skakun
@FilipSkakun 你所说的 keyed styles 是什么意思?我想忽略实际HTML中的所有样式,并将我在XAML中定义的样式应用于转换后的输出。 - Igor Kulman
哦,我明白了 - 就像在段落和内联不支持样式时重用文本块样式一样?这可能是不可能的。您可以尝试使用DataTemplates而不是样式。例如 <DataTemplate x:Name="boldTextRunTemplate"><Run FontWeight="Bold"/>...然后执行var boldRun = (Run)boldTextRunTemplate.LoadContent() - Filip Skakun
@FilipSkakun 是的,我不想硬编码类的样式,但是我希望调用者能够给类提供任何他想要的样式。使用在 XAML 中定义的样式比在代码中创建并将其传递给类更好。使用 DataTemplate 不是一个选择,因为你可能有更多嵌套的样式,比如<b><i>hello</i>world</b>,为每个样式定义一个 DataTemplate 是不可行的。 - Igor Kulman
好主意。我猜如果没有人知道你的问题的答案,你可以定义一些自定义样式实现... - Filip Skakun
1个回答

2
你可以尝试这样做:
var fontWeightSetter =
    style.Setters.Cast<Setter>().FirstOrDefault(
        setter => setter.Property == TextElement.FontWeightProperty);

var fontWeight =
    fontWeightSetter != null ?
        (FontWeight)fontWeightSetter.Value :
        FontWeights.Normal;

或者检查是否有效:
public static class StyleExtensions
{
    // Untested
    public static object GetPropertyValue(this Style style, DependencyProperty property)
    {
        var setter =
            style.Setters.Cast<Setter>().FirstOrDefault(
                s => s.Property == property);
        var value = setter != null ? setter.Value : null;

        if (setter == null &&
            style.BasedOn != null)
        {
            value = style.BasedOn.GetPropertyValue(property);
        }

        return value;
    }
}

太棒了!我会将它加入工具包中的。 :) - Filip Skakun
你好,有没有一种方法可以将GetPropertyValue(它是一个BindingExpressionBase)的返回值分配给像TextBlock.FontFamily这样的样式属性?谢谢。 - Birkan Cilingir
1
所以这个方法会返回一个 BindindExpressionBase 对象?我猜这一定是针对 WPF 或 Silverlight 的吧?我不认为 WinRT 有这个。我会另外提问的。 - Filip Skakun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接