3

我有一个简单的 IMarkupExtension 如下:

public class HelloWorldMarkup : IMarkupExtension<string>
{
    public string ProvideValue(IServiceProvider serviceProvider)
    {
        return "Hello World";
    }
    public override string ToString()
    {
        return "DesignTime Hello World";
    }
}

和我这样使用它的Xaml ..

<StackPanel>
    <TextBlock Text="{my:HelloWorldMarkup}" />
    <HyperlinkButton Content="{my:HelloWorldMarkup}" />
</StackPanel>

在运行时,一切都按预期工作。

然而,在设计时,超链接的内容显示设计时值(来自 ToString),但 TextBlock 的文本不显示。

如果我这样离开它,我的设计师会抱怨我好几天。有没有人对我如何让我的标记在 TextBlock Text 中显示设计时数据有任何建议?

非常感谢,

4

2 回答 2

5

尝试..

<TextBlock DataContext="{my:HelloWorldMarkup}" Text="{Binding}" />
于 2011-12-28T10:21:41.520 回答
1

你是在正确的轨道上的一半。这个(“设计”)问题有一些很好的解决方法:

使用接口 IMarkupExtension 并从具有内容属性的某些控件(例如 ContentControl)派生。现在收听“父”属性的更改(您可能必须使用附加属性使用一些棘手的解决方法)。然后,事件回调应使用自定义的简单 IProvideValueTarget 实现自行调用 ProvideValue。然后必须将 ProvideValue 的结果分配给“内容”属性。这不会影响运行时,因为 ProvideValue 将在控件之前进行评估,并且在设计时就像一个魅力。

我也在考虑在目标属性上安装一个绑定,从而将基类减少到 FrameworkElement。

有关此过程的示例,请参阅https://github.com/MrCircuit/XAMLMarkupExtensionshttps://github.com/MrCircuit/WPFLocalizationExtension 。

于 2012-06-05T07:03:05.613 回答