Binding the Content property of a ContentControl in WinRT

后端 未结 2 557
萌比男神i
萌比男神i 2020-12-19 05:41

Let\'s say I have a Windows Store app (targeting Windows 8.1), and on a page there\'s a ContentControl that looks like this:


  

        
相关标签:
2条回答
  • 2020-12-19 06:16

    Normally, a resource is a shared "single instance" and various XAML elements are referring to the single shared instance. I'm not sure why the Designer implies this would work (other than its heritage in supporting multiple types of "XAML"). In the case of a TextBlock though, it's a bit different as you'd want the Element instance to be able to be replicated and instantiated multiple times (potentially being hosted in multiple ContentControls for example).

    WPF had a feature to make this work, in a a special attribute called x:Shared. You'd set that to false to indicate that a Resource was not shared and that each request for the resource should return a new instance. WinRT does not have this same feature.

    There is a fully supported work-around however that you might consider.

    One option would be to use a Template instead of replacing the content directly as you have tried:

    <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>
    

    Syntactically, it's a little longer of course, but functionally, it should be the same results.

    Without the x:Shared, you are limited to being able to bind to resources that are the intrinsic data types, such as x:string (as the example below works):

    <Page.Resources>
        <x:String x:Key="tbResource">The Text!</x:String>
    </Page.Resources>
    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" >
        <ContentControl Content="{StaticResource tbResource}" ></ContentControl>
    </Grid>
    
    0 讨论(0)
  • 2020-12-19 06:23

    My assumption is that you are using Visual Studio 2012. There were other such errors in 2012 that were resolved in Visual Studio 2013. Your code, which is perfect, works fine in Visual Studio 2013.

    enter image description here

    Best of luck!

    0 讨论(0)
提交回复
热议问题