假设我有一个Windows应用商店应用(针对Windows 8.1),并且在页面上有一个ContentControl,如下所示:
<ContentControl>
<ContentControl.Content>
<TextBlock>Hello world</TextBlock>
</ContentControl.Content>
</ContentControl>
这非常正常,但如果我尝试将内容设置为资源,请执行以下操作:
<Page.Resources>
<TextBlock x:Key="TestContent">Hello world</TextBlock>
</Page.Resources>
<ContentControl Content="{StaticResource TestContent}" />
设计师看起来很棒,但我在运行时遇到以下错误:
无法分配属性 'Windows.UI.Xaml.Controls.ContentControl.Content'
我已尝试在各个地方定义资源(app.xaml,单独的资源文件等)但每次都会收到相同的错误。
所以,我有一些问题:
答案 0 :(得分:6)
通常,资源是共享的“单个实例”,并且各种XAML元素指的是单个共享实例。我不确定为什么设计师暗示这会起作用(除了它支持多种类型的“XAML”的遗产)。但是在TextBlock
的情况下,它有点不同,因为您希望Element实例能够被多次复制和实例化(例如,可能托管在多个ContentControl
中)。
WPF在一个名为x:Shared
的特殊属性中具有使其工作的功能。您将其设置为false
以指示未共享Resource
并且每个资源请求都应返回一个新实例。 WinRT没有相同的功能。
您可以考虑使用完全支持的解决方法。
一种选择是使用模板而不是直接替换内容:
<Page.Resources>
<Style x:Name="replacement" TargetType="ContentControl">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<TextBlock FontSize="100" Foreground="Red">Hello!</TextBlock>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ContentControl Style="{StaticResource replacement}"></ContentControl>
</Grid>
从语法上讲,它当然要长一点,但从功能上来说,它应该是相同的结果。
如果没有x:Shared
,您只能绑定到作为内部数据类型的资源,例如x:string
(如下例所示):
<Page.Resources>
<x:String x:Key="tbResource">The Text!</x:String>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
<ContentControl Content="{StaticResource tbResource}" ></ContentControl>
</Grid>
答案 1 :(得分:0)
我的假设是您正在使用Visual Studio 2012. 2012年还有其他此类错误在Visual Studio 2013中得到解决。您的代码非常完美,在Visual Studio 2013中运行良好。
祝你好运!