C# 动态切换控件类型以显示不同的内容类型
在我的应用程序(windows 8.1)中,我使用分割Visual Studio模板。它正在工作,如果我选择一个项目,我可以显示文本内容 内容混合了文本、图像和PDF 那么如何根据内容数据动态切换控件类型(如TextBlock、Image、UserControl? 如果我得到文本,它应该显示在文本块中,但如果我得到图像(链接),它应该显示在图像控件中。(也许切换控制类型的方法是错误的,我不知道!) 我可以在XAML中解决这个问题,还是应该在代码隐藏中解决这个问题? 我不知道该怎么做。谁能给我一个提示吗C# 动态切换控件类型以显示不同的内容类型,c#,wpf,xaml,C#,Wpf,Xaml,在我的应用程序(windows 8.1)中,我使用分割Visual Studio模板。它正在工作,如果我选择一个项目,我可以显示文本内容 内容混合了文本、图像和PDF 那么如何根据内容数据动态切换控件类型(如TextBlock、Image、UserControl? 如果我得到文本,它应该显示在文本块中,但如果我得到图像(链接),它应该显示在图像控件中。(也许切换控制类型的方法是错误的,我不知道!) 我可以在XAML中解决这个问题,还是应该在代码隐藏中解决这个问题? 我不知道该怎么做。谁能给我一个
<Grid x:Name="itemDetailGrid" Margin="0,60,0,50">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Image Source="{Binding ImagePath}" Grid.Row="1" Margin="0,0,20,0" Width="180" Height="180" Stretch="UniformToFill" AutomationProperties.Name="{Binding Title}"/>
<StackPanel x:Name="itemDetailTitlePanel" Grid.Row="1" Grid.Column="1">
<TextBlock x:Name="itemTitle" Margin="0,-10,0,0" Text="{Binding Title}" Style="{StaticResource SubheaderTextBlockStyle}"/>
<TextBlock x:Name="itemSubtitle" Margin="0,0,0,20" Text="{Binding Subtitle}" Style="{StaticResource SubtitleTextBlockStyle}"/>
</StackPanel>
<!-- <TextBlock Grid.Row="2" Grid.ColumnSpan="2" Margin="0,20,0,0" Text="{Binding Content}" Style="{StaticResource BodyTextBlockStyle}"/> -->
<Image Source="{Binding Content}" Grid.ColumnSpan="2" Grid.Row="2" Margin="0,20,0,0" Stretch="UniformToFill" />
您的问题的答案是使用
DataTemplate
s定义每个数据类型在UI中的呈现方式。您只需为每个不同的数据类型声明一个DataTemplate
:
<DataTemplate DataType="{x:Type System:String}">
<TextBlock Text="{Binding}">
</DataTemplate>
...
<DataTemplate DataType="{x:Type Custom:DataObject}">
<UserControl DataContext="{Binding}">
</DataTemplate>
...
如果省略了
x:Key
引用(如上面的示例中所示),则每当遇到一种指定的数据类型时,框架将自动呈现相关DataTemplate
的内容。有关更多详细信息,请参见MSDN页面 嗯。。。我认为OP使用的是WinRT,WinRT中没有{x:Type}
。。。我想知道“分割Visual Studio模板”是什么。哦,sry,是的,我正在使用WinRT。也许这也可以通过DataTemplateSelector
实现。但我的内容类型总是字符串。如果我得到一张图片或pdf,我只得到链接。那么,我怎样才能选择哪个DataTemplate
来在我的应用程序中显示它呢?如果你没有提供问题中的所有相关信息,就会出现这种情况。。。您得到的答案无效。如果所有数据类型都是string
,则无法使用DataTemplateSelector
。。。你如何区分它们?您需要使用实际不同类型的对象来执行此操作。我从SharePoint获取数据。我可以通过文件扩展名来区分它是链接还是/并且我在映射列表中设置了附加标志。