从后面的代码设置内容控制内容属性抛出异常'值不在范围内'

时间:2013-06-13 19:16:41

标签: wpf xaml winrt-xaml windows-8.1

我在WPF中使用了xaml绑定方案。在UIElements的资源中定义Grid。将这些静态资源绑定到ToggleButton的{​​{1}}属性。在切换按钮上,单击将Tag属性分配给Tag的{​​{1}}属性。

Content

点击切换按钮只会将标记值分配给ContentControl属性。

<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抱怨Content'价值不在预期范围内。'。我不知道为什么?

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

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    cc.Content = ((FrameworkElement)sender).Tag;
}

为了让它更奇怪我在WinRT中尝试了这个:

ArgumentException

结果:它在设计器中有效,但在运行时失败。对此更加无能为力。

首先,ArgumentException试图告诉我什么?第二个为什么它在WPF中工作?那么运行时和VS设计师之间的差异呢?

1 个答案:

答案 0 :(得分:4)

在Win RT / Windows 8商店应用中,内容控件不能包含其他地方视图中已存在的元素。因为它存在于Grid.Resources中,所以无法添加到ContentControl。

我建议在资源中使用DataTemplate:

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

然后在按钮中单击以下内容:

private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
{
    var dataTemplate = ((FrameworkElement)sender).Tag as DataTemplate;
    cc.Content = dataTemplate.LoadContent() as FrameworkElement;
}

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