我在尝试将大型项目升级到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
如果您认为这很重要,请投票!答案 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}"
虽然我还没有测试过这个解决方案。