【问题标题】:Binding the Content property of a ContentControl in WinRT在 WinRT 中绑定 ContentControl 的 Content 属性
【发布时间】:2014-01-30 15:02:57
【问题描述】:

假设我有一个 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、单独的资源文件等)定义资源,但每次都遇到相同的错误。

所以,我有一些问题:

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

【问题讨论】:

    标签: xaml windows-runtime winrt-xaml visual-studio-2013


    【解决方案1】:

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

    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>
    

    【讨论】:

    • 宾果游戏!出色的解释和替代解决方案 - 非常感谢。
    【解决方案2】:

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

    祝你好运!

    【讨论】:

    • 谢谢 Jerry - 不,对不起,我在 VS 2013 中(我的目标是 Windows 8.1,我认为它需要它) - 在设计器中似乎一切正常,只是在运行时我得到错误
    • 这实际上是一个错误,设计师建议代码可以工作。如果您有兴趣,我的回答会提供更多详细信息。
    猜你喜欢
    • 2013-04-02
    • 1970-01-01
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    相关资源
    最近更新 更多