2

我得到了在 WPF 中工作的以下 xaml 绑定场景。UIElementsGrid的资源中定义。将这些静态资源绑定到 aToggleButtonTag属性。在切换按钮上单击将Tag属性分配给 的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>

切换按钮单击只是将标记值分配给Content属性。

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

虽然这在全能的 WPF 中有效,但在 WinRT 中是不可能的。WinRT 抱怨ArgumentException“值不在预期范围内。”。我不知道为什么?

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

 cc.Content = new TextBlock { Text = "Text1" };

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

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

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

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

4

1 回答 1

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

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

于 2014-03-06T09:28:31.653 回答