首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TemplateSelector for UWP NavigationView

TemplateSelector for UWP NavigationView
EN

Stack Overflow用户
提问于 2019-03-21 19:21:48
回答 2查看 473关注 0票数 1

如何正确地将MenuItemTemplateSelector用于UWP NavigationView?我已经从互联网上找到了一些样本并试用了它们(代码如下)。但是它没有工作,因为它应该只打印类名。目前im运行在Windows版本1809上。我已经尝试过在listView中使用相同的模板,它可以工作,所以我想知道NavigationView中是否有bug,或者我遗漏了什么?(预先谢谢:)

这就是我的代码的样子:

创建模板选择器:

代码语言:javascript
复制
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);
    }
}

将类似的内容放在页面资源中:

代码语言:javascript
复制
 <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

代码语言:javascript
复制
<NavigationView MenuItemsSource="{x:Bind ViewModel.NavigationItems, Mode=OneWay}" 
                MenuItemTemplateSelector="{StaticResource NVMenuItemsSelector}">

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-03-22 10:44:24

在查看了上面的链接之后,我决定将一个NavigationViewItem放在我的模板中

代码语言:javascript
复制
<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当第一个孩子了。

票数 1
EN

Stack Overflow用户

发布于 2019-03-21 20:53:10

看看这个链接。

Cannot bind Icon property in NavigationView MenuItemTemplate

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

代码语言:javascript
复制
<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>
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55287867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档