Silverlight 5标记扩展在设计时

时间:2011-12-01 03:09:06

标签: silverlight design-time silverlight-5.0

我有一个简单的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中显示我的Markups显示设计时间数据有任何建议?

非常感谢,

2 个答案:

答案 0 :(得分:5)

尝试..

<TextBlock DataContext="{my:HelloWorldMarkup}" Text="{Binding}" />

答案 1 :(得分:1)

你正走在正确的轨道上。对此(“设计”)问题有一些很好的解决方法:

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

我也在考虑在target属性上安装Binding,从而将基类减少为FrameworkElement。

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