Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 动态切换控件类型以显示不同的内容类型_C#_Wpf_Xaml - Fatal编程技术网

C# 动态切换控件类型以显示不同的内容类型

C# 动态切换控件类型以显示不同的内容类型,c#,wpf,xaml,C#,Wpf,Xaml,在我的应用程序(windows 8.1)中,我使用分割Visual Studio模板。它正在工作,如果我选择一个项目,我可以显示文本内容 内容混合了文本、图像和PDF 那么如何根据内容数据动态切换控件类型(如TextBlock、Image、UserControl? 如果我得到文本,它应该显示在文本块中,但如果我得到图像(链接),它应该显示在图像控件中。(也许切换控制类型的方法是错误的,我不知道!) 我可以在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获取数据。我可以通过文件扩展名来区分它是链接还是/并且我在映射列表中设置了附加标志。