隐式主题错误:在“System.Windows.Controls.Control”类型中找不到属性“Content”

时间:2010-05-24 01:59:03

标签: silverlight silverlight-4.0 themes

我在尝试将大型项目升级到SL4时遇到错误。 我没有写原始主题,我的主题知识不是很好。 在我的演示应用程序中,我有一个Label和一个LabelHeader(我已经创建了它,它只是Label中的派生类,DefaultStyleKey = typeof(LabelHeader);
我正在为这样的LabelHeader设计样式:

 <Style TargetType="themeControls:LabelHeader">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <DataInput:Label 
                    FontSize="{TemplateBinding FontSize}" 
                    FontFamily="{TemplateBinding FontFamily}" 
                    Foreground="{TemplateBinding Foreground}" 
                    Content="{TemplateBinding  Content}"/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="FontFamily" Value="Tahoma"/>
    <Setter Property="FontSize" Value="20"/>
    <Setter Property="Foreground" Value="Red"/>
</Style>

这适用于SL3但在SL4中我得到:

错误:Silverlight应用程序中的未处理错误 代码:2500
类别:ParserError
消息:在'System.Windows.Controls.Control'类型中找不到属性'Content' 文件:
行:9
位置:168

如果我改变了这个: Content =“{TemplateBinding Content}” 至 CONTENT = “XXX” 然后没有错误,但是,当然,我在我的标签中得到XXX而不是我在页面上的XAML中设置的内容

我有什么想法可以让它发挥作用吗?

这里的演示项目:

http://walkersretreat.co.nz/files/ThemeIssue.zip

(对于重新发布道歉,到目前为止,我没有得到任何答案:http://forums.silverlight.net/forums/p/183380/415930.aspx#415930

编辑提供的答案看起来会起作用。此问题已在此处打开一个问题: https://connect.microsoft.com/VisualStudio/feedback/details/561183

如果您认为这很重要,请投票!

2 个答案:

答案 0 :(得分:6)

感谢Wolf Schmidt(MSFT)在www.silverlight.net论坛上的帖子,该问题已经被识别,解释并可能按照设计解决。据他介绍,Silverlight 4现在将以更严格的方式考虑Silverlight 3关于ControlTemplates的准动态行为,当ControlTemplate的TargetType不存在属性时,会导致Silverlight 4出错。需要注意的是,当ControlTemplate中未指定TargetType时,它默认为TargetType =“Control”。

问题的解决方法是为ControlTemplate指定TargetType,以便模板绑定中使用的属性将解析。

这是一个更新的样式,其中为ControlTemplate指定了TargetType:

<Style x:Key="LabelHeader" TargetType="controls:Label">
    <Setter Property="Margin" Value="0" />
    <Setter Property="Opacity" Value=".6" />
    <Setter Property="VerticalAlignment" Value="Stretch" />
    <Setter Property="VerticalContentAlignment" Value="Center" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="controls:Label">
                <Border BorderBrush="#CCCCCCCC" BorderThickness=".5" Background="#CCEFEFEF">
                    <ContentPresenter VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Margin="2" Content="{TemplateBinding Content}"/>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

如果IDE / intellisense可以验证TemplateBinding中指定的属性实际存在于ControlTemplate的默认/指定TargetType上,那么它对开发人员非常有用。

来自:   - 我们关于Silverlight .NET的论坛讨论:(没有足够的声誉发布&gt; 1超链接)   - 我的MS Connect问题:https://connect.microsoft.com/VisualStudio/feedback/details/561183

答案 1 :(得分:4)

当出现此异常时,Silverlight 4中的某些情况会出现错误。它特定于内容属性。

临时修复似乎是对Content属性使用普通绑定。

Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"

虽然我还没有测试过这个解决方案。