【问题标题】:TemplateSelector for UWP NavigationViewUWP NavigationView 的模板选择器
【发布时间】:2019-03-21 19:21:48
【问题描述】:

如何正确使用 UWP NavigationView 的 MenuItemTemplateSelector? 我从互联网上查找了一些示例并尝试了它们(代码如下)。但它不起作用,因为它应该只打印类名。 目前我在 Windows 版本 1809 上运行。我已经尝试在 listView 中使用相同的模板并且它可以工作,所以我想知道 NavigationView 中是否可能存在错误,或者我错过了什么? 在此先感谢:)

这是我的代码的样子:

创建模板选择器:

public class NavigationItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate DriveTemplate { get; set; }
    public DataTemplate PathTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        return SelectTemplateCore(item);
    }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        if (item is Drive) return DriveTemplate;
        if (item is FileSystemElement) return PathTemplate;

        return base.SelectTemplateCore(item);
    }
}

在你的页面资源中加入这样的东西:

 <Page.Resources>
    <DataTemplate x:Key="FileSystemDataTemplate" x:DataType="entities:FileSystemElement">
        <StackPanel>
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </DataTemplate>
    <DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
        <StackPanel>
            <SymbolIcon Symbol="{x:Bind Icon}" />
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </DataTemplate>
    <entities:NavigationItemTemplateSelector x:Key="NVMenuItemsSelector" 
                                             DriveTemplate="{StaticResource DriveDataTemplate}" 
                                             PathTemplate="{StaticResource FileSystemDataTemplate}">
    </entities:NavigationItemTemplateSelector>
</Page.Resources>


告诉 NavigationView 它应该使用这个 TemplateSelector

<NavigationView MenuItemsSource="{x:Bind ViewModel.NavigationItems, Mode=OneWay}" 
                MenuItemTemplateSelector="{StaticResource NVMenuItemsSelector}">

【问题讨论】:

  • 请参考这个案例reply

标签: c# xaml uwp windows-10


【解决方案1】:

查看此链接。

Cannot bind Icon property in NavigationView MenuItemTemplate

我相信将您的 StackPanel 包装在 ContentPresenter 中会解决您的问题。

<DataTemplate x:Key="FileSystemDataTemplate" x:DataType="entities:FileSystemElement">
    <ContentPresenter>
        <StackPanel>
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </ContentPresenter>
</DataTemplate>
<DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
    <ContentPresenter>
        <StackPanel>
            <SymbolIcon Symbol="{x:Bind Icon}" />
            <TextBlock Text="{x:Bind Name}" />
        </StackPanel>
    </ContentPresenter>
</DataTemplate>

【讨论】:

    【解决方案2】:

    查看以上链接后,我决定将 NavigationViewItem 放入我的模板中

    <DataTemplate x:Key="DriveDataTemplate" x:DataType="entities:Drive">
            <NavigationViewItem Icon="{x:Bind SymbolIcon}">
                <StackPanel Orientation="Horizontal">
                    <TextBlock Text="{x:Bind Name}" />
                </StackPanel>
            </NavigationViewItem>
    </DataTemplate>
    

    而且它有效。似乎您必须将 NavigationViewItem 作为第一个孩子。

    【讨论】:

    • 感谢发布。我有一个 muxc:NavigationView,它最初使用了一个 DataTemplate,它的孩子是一个 Grid。当我添加第二个 DataTemplate 并使用 MenuItemTemplateSelector 在两者之间进行选择时,我遇到了严重的崩溃 - 发送到我的 DataTemplateSelector 类的对象似乎已损坏。当我将 DataTemplates 更改为使用 NavigationViewItem 作为 DataTemplate 的子级时,崩溃就消失了。我永远不会猜到这是一种解决方法......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2022-11-10
    • 2012-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多