在Windows 10版本之间的NavigationView的项目模板中无法实现相同的行为

时间:2018-12-27 09:16:57

标签: c# xaml uwp

尝试在UWP应用中实现相同的视觉行为令我非常沮丧。这是我的问题:

我正在使用NavigationView,并且想从ViewModel中提供NavigationViewItem。我还想提供标题,因此我创建了一个ICollectionDataItem接口,并为NavigationViewItem和NavigationViewItemHeader都实现了ViewModels,以便主视图模型将ICollectionDataItem的列表提供给NavigationView,而DataTemplateSelector起到了神奇的作用。这就是现在的样子:

<NavigationView 
  MenuItemsSource="{Binding Home.CollectionsView, Source={StaticResource Locator}}"
  MenuItemTemplateSelector="{StaticResource NavigationViewTemplateSelector}" />

public interface ICollectionDataItem
{
    string Title { get; set; }
    string Glyph { get; set; }
    bool IsVisible { get; set; }
    bool IsHeader { get; set; }
}

然后我为NavigationViewItem创建一个数据模板,为NavigationViewItemHeader创建另一个:

<DataTemplate x:Key="NavigationItemTemplate" x:DataType="models:ICollectionDataItem">
  <NavigationViewItem> <!--Bindings-->
  </NavigationViewItem>
</DataTemplate>
<DataTemplate x:Key="NavigationHeaderTemplate" x:DataType="models:ICollectionDataItem">
  <NavigationViewItemHeader> <!--Bindings-->
  </NavigationViewItemHeader>
</DataTemplate>

现在,当然是DataTemplateSelector:

public DataTemplate NavItemTemplate { get; set; }
public DataTemplate NavItemHeaderTemplate { get; set; }

protected override DataTemplate SelectTemplateCore(object item)
{
    ICollectionDataItem data = (ICollectionDataItem)item;
    return (data.IsHeader) ? NavItemHeaderTemplate : NavItemTemplate;
}

这工作得很好……直到不行。 Windows 10 SDK 1809中NavigationViewItem的默认样式与1803中的样式完全不同。虽然在第一个SDK中一切正常,但是在第二个SDK中,它不能将NavigationHeaderTemplate识别为NavigationViewItemHeader,而是显示了一个NavigationViewItem,其中NavigationViewItemHeader作为内容这是完全可以选择的。

我可以想象如何解决NavigationViewItem的问题,可以检查Windows版本,可以为不同的版本设置不同的模板,但是我的问题是:

如何提供ICollectionDataItem的列表到NavigationView,然后使用xaml将其转换为NavigationViewItem和NavigationViewItemHeader,并保证Windows 10 1803和1809中的行为相同(我不假装使用之前的版本)?

也许您认为答案很明显,请自己尝试一下,您会看到的。

我对此问题感到非常沮丧;任何帮助将不胜感激。

预先感谢

2 个答案:

答案 0 :(得分:2)

除了使用SplitView并实现自定义导航(这基本上是NavigationView所做的)之外,我看不到任何其他解决方案-如所述,这似乎是操作系统级别的错误。

答案 1 :(得分:1)

我检查了最新的NavigationView。并且它具有许多新功能,例如顶部放置。我们为新的NavigationViewItemPresenter添加了NavigationView类。当然,我们建议您使用最新版本的NavigationView。如果确实要使其在不同的目标版本中具有相同的外观。您可以使用来自Community Tool Kit的NavigationView。