Wpf 从codebehind设置ContentControls内容属性引发异常';值不在范围内';
我在WPF中得到了以下xaml绑定场景。在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" /> <
网格
的资源中定义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;
}