win 8 metro app c#multiple itemTemplate

eom*_*mer 1 c# xaml microsoft-metro windows-runtime windows-store-apps

我在地铁应用程序上工作,我有情况.在我的一个页面中,我使用listview和一个显示图像及其名称的自定义项目模板.现在我必须使用2项模板如果图像是垂直的我必须使用另一个更高的模板.列表视图中可以有2个不同的模板吗?我必须在.cs中更改模板,比如 if the image is horizontal listview.ItemTemplate = 1 else if the image is vertical listvew.ItemTemplate =2 我可以使用它吗?

Dam*_*Arh 6

首先创建一个自定义DataTemplateSelector类:

public class OrientationTemplateSelector : DataTemplateSelector
{
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        // cast item to your custom item class
        var customItem = item as CustomItem;
        if (customItem == null)
            return null;

        string templateName = String.Empty;
        if (customItem.Width > customItem.Height
        {
            // image is horizontal
            templateName = "HorizontalItemTemplate";
        }
        else
        {
            templateName = "VerticalItemTemplate";
        }

        object template = null;
        // find template in App.xaml
        Application.Current.Resources.TryGetValue(templateName, out template);
        return template as DataTemplate;
    }
}
Run Code Online (Sandbox Code Playgroud)

将项目模板定义为资源(​​在我的情况下App.xaml- 确保在模板选择器内的正确位置搜索它们):

<Application.Resources>
    <DataTemplate x:Key="HorizontalItemTemplate">
        <!-- item template for horizontal image -->
    </DataTemplate>
    <DataTemplate x:Key="VerticalItemTemplate">
        <!-- item template for vertical image -->
    </DataTemplate>
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

添加模板选择器作为资源(在ListView下面或更高的级别,即页面或应用程序级别):

<ListView.Resources>
    <local:OrientationTemplateSelector x:Key="OrientationTemplateSelector" />
</ListView.Resources>
Run Code Online (Sandbox Code Playgroud)

现在,您可以将其设置为ItemTemplateSelector你的ListView:

<ListView ItemTemplateSelector="{StaticResource OrientationTemplateSelector}" ItemsSource="{Binding CustomItemsList}" />
Run Code Online (Sandbox Code Playgroud)