Wpf 从codebehind设置ContentControls内容属性引发异常';值不在范围内';

Wpf 从codebehind设置ContentControls内容属性引发异常';值不在范围内';,wpf,xaml,winrt-xaml,windows-8.1,Wpf,Xaml,Winrt Xaml,Windows 8.1,我在WPF中得到了以下xaml绑定场景。在网格的资源中定义ui元素。将这些静态资源绑定到切换按钮的标记属性。在切换按钮上,单击将标记属性分配给ContentControl的Content属性 <Grid> <Grid.Resources> <TextBlock x:Key="t1" Grid.Row="1" Text="Text1" /> <

我在WPF中得到了以下xaml绑定场景。在
网格
的资源中定义
ui元素
。将这些静态资源绑定到
切换按钮
标记
属性。在切换按钮上,单击将
标记
属性分配给
ContentControl
Content
属性

<Grid>
    <Grid.Resources>
        <TextBlock x:Key="t1"
                   Grid.Row="1"
                   Text="Text1" />
        <TextBlock x:Key="t2"
                   Grid.Row="1"
                   Text="Text2" />
    </Grid.Resources>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Orientation="Horizontal"
                HorizontalAlignment="Center">
        <ToggleButton Tag="{StaticResource t1}"
                      Margin="10"
                      Click="ButtonBase_OnClick"
                      Content="T1" />
        <ToggleButton Tag="{StaticResource t2}"
                      Margin="10"
                      Click="ButtonBase_OnClick"
                      Content="T1" />
    </StackPanel>

    <ContentControl x:Name="cc"
                    Grid.Row="1" />
</Grid>
虽然这在全能的WPF中有效,但在WinRT中是不可能的。WinRT向ArgumentException投诉“值不在预期范围内”。我不知道为什么

出于测试目的,我在事件处理程序中尝试了一个直接赋值,它按预期工作:

 cc.Content = new TextBlock { Text = "Text1" };
更奇怪的是,我在WinRT中尝试了这个:

<ContentControl x:Name="cc"
                Content="{StaticResource t1}"
                Grid.Row="1" />

结果:它在设计器中工作,但在运行时失败。对此更是一无所知


首先,ArgumentException想告诉我什么?第二,为什么它在WPF中工作?运行时和VS designer之间的差异如何?

在Win RT/Windows 8应用商店应用程序中,内容控件不能包含已存在于视图其他位置的元素。由于它存在于Grid.Resources中,因此无法将其添加到ContentControl

我建议在参考资料中制作一个DataTemplate:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="t1">
            <TextBlock Text="Text1" />
        </DataTemplate>
...

注意:我没有机会对此进行测试。

在Win RT/Windows 8应用商店应用程序中,内容控件不能包含已存在于其他位置的视图中的元素。由于它存在于Grid.Resources中,因此无法将其添加到ContentControl

我建议在参考资料中制作一个DataTemplate:

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="t1">
            <TextBlock Text="Text1" />
        </DataTemplate>
...

注意:我没有机会测试这个。

我不知道你在说什么。所有这些听起来像一个可怕的黑客,我的意思是,
标签
属性?这是什么?为什么不创建一个合适的ViewModel并使用
DataTemplates
动态定义
ContentPresenter
的内容呢?我知道有比您建议的更优雅的解决方案。但我只是好奇为什么它不起作用。把它当作一个脑筋急转弯。在它用WinRT爆炸之前,标签值是一个预期的文本块吗?它是一个
Windows.UI.Xaml.Controls.TextBlock
。在WPF中,ContentControl内容的类型是Object,WinRT中的类型是什么?可能是它的FrameworkElement或UIElement,所以您可能必须将标记(对象)转换为它期望的类型(这完全是推测):)我不知道您在说什么。所有这些听起来像一个可怕的黑客,我的意思是,
标签
属性?这是什么?为什么不创建一个合适的ViewModel并使用
DataTemplates
动态定义
ContentPresenter
的内容呢?我知道有比您建议的更优雅的解决方案。但我只是好奇为什么它不起作用。把它当作一个脑筋急转弯。在它用WinRT爆炸之前,标签值是一个预期的文本块吗?它是一个
Windows.UI.Xaml.Controls.TextBlock
。在WPF中,ContentControl内容的类型是Object,WinRT中的类型是什么?可能是它的FrameworkElement或UIElement,因此您可能必须将标记(对象)转换为它期望的类型(这完全是推测):)
private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    var dataTemplate = ((FrameworkElement)sender).Tag as DataTemplate;
    cc.Content = dataTemplate.LoadContent() as FrameworkElement;
}