在WinRT中绑定ContentControl的Content属性

7

假设我有一个针对Windows 8.1的Windows Store应用程序,页面上有一个看起来像这样的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、单独的资源文件等)中定义资源,但每次都会收到相同的错误。

所以,我有一些问题:

  1. 在WinRT XAML中是否可能实现这一点?难道我只是做了一些愚蠢的事情吗?
  2. 是否有另一种方法可以对任意内容进行资源化,例如路径数据?(我通过为Path元素定义样式,在setter中配置路径数据取得了一些有限的成功,但似乎在导航回页面时不会重新绑定。那是一个完全不同的问题...)
2个回答

6
通常,资源是一个共享的“单一实例”,各种XAML元素都引用同一个共享实例。我不确定为什么设计师会暗示这会起作用(除了它在支持多种类型的“XAML”方面具有传统)。但对于来说,情况有点不同,因为您希望Element实例能够被复制和实例化多次(例如可能托管在多个中)。
WPF有一个功能可以使其正常工作,即一个名为的特殊属性。将其设置为false表示不是共享的,并且每个对资源的请求都应返回一个新实例。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>

太棒了!非常好的解释和替代方案 - 非常感谢。 - Mike Goatly

0

我的假设是您正在使用Visual Studio 2012。在2012年,还有其他类似的错误,在Visual Studio 2013中得到了解决。您的代码非常完美,在Visual Studio 2013中可以正常工作。

enter image description here

祝你好运!


谢谢Jerry - 不好意思,我在使用VS 2013(我正在针对需要它的Windows 8.1),在设计器中一切似乎都正常,只是在运行时出现了错误。 - Mike Goatly
实际上,设计师建议代码可以工作是一个错误。如果您感兴趣,我的答案有更多细节。 - WiredPrairie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接