Xaml 在WinRT中绑定ContentControl的Content属性

Xaml 在WinRT中绑定ContentControl的Content属性,xaml,windows-runtime,winrt-xaml,visual-studio-2013,Xaml,Windows Runtime,Winrt Xaml,Visual Studio 2013,假设我有一个Windows应用商店应用程序(针对Windows 8.1),页面上有一个ContentControl,看起来像这样: <ContentControl> <ContentControl.Content> <TextBlock>Hello world</TextBlock> </ContentControl.Content> </ContentControl> <Page.Resources

假设我有一个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}" />

你好,世界
这非常好,但如果我尝试将内容设置为资源,如下所示:

<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、单独的资源文件等)定义资源,但每次都会遇到相同的错误

因此,我有一些问题:

  • 这在WinRT XAML中是否可行?我只是在做些傻事吗
  • 是否有其他方法可以为这样的任意内容(例如路径数据)提供资源?(通过为路径元素定义样式、在setter中配置路径数据,我取得了一些有限的成功,但在导航回页面时,它似乎没有重新绑定。不过这是另一个问题……)

  • 我的假设是您正在使用Visual Studio 2012。2012年还有其他此类错误在Visual Studio 2013中解决。您的代码非常完美,在Visual Studio 2013中运行良好


    祝你好运

    通常,资源是共享的“单个实例”,各种XAML元素都引用单个共享实例。我不知道为什么设计师暗示这会起作用(除了它在支持多种类型的“XAML”方面的传统)。但是,对于
    TextBlock
    来说,这有点不同,因为您希望元素实例能够被多次复制和实例化(例如,可能托管在多个
    ContentControl
    s中)

    WPF有一个使这项工作的特性,在一个名为
    x:Shared
    的特殊属性中。您将其设置为
    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>
    

    谢谢Jerry-不,对不起,我在VS 2013(我的目标是Windows 8.1,我想这需要它)-在设计器中一切似乎都很好,只是在运行时我收到了错误。实际上,这是一个错误,设计者建议代码可以工作。如果你感兴趣的话,我的答案会更详细。答对了!非常好的解释和替代解决方案-非常感谢。