我在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设计师之间的差异呢?
答案 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;
}
注意:我没有机会对此进行测试。