it-swarm.com.ru

Не удается добиться того же поведения в шаблоне элемента NavigationView в версиях Windows 10

Я очень расстроен, пытаясь добиться того же визуального поведения в моем приложении UWP. Вот моя проблема:

Я использую NavigationView и хочу предоставить NavigationViewItem (s) из ViewModel. Я также хочу предоставить заголовки, поэтому я создаю интерфейс ICollectionDataItem и реализую ViewModels как для NavigationViewItem, так и для NavigationViewItemHeader, так что модель основного представления предоставляет список 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; }
}

Затем я создаю DataTemplate для 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;
}

Это прекрасно работает ... пока это не так. Стиль по умолчанию для NavigationViewItem в Windows 10 SDK 1809 полностью отличается от 1803. Хотя в первом SDK все работает идеально, во втором он не распознает NavigationHeaderTemplate как NavigationViewItemHeader, вместо этого он показывает NavigationViewItem с NavigationViewItemHeader в качестве содержимого который отлично выбирается. 

Я могу представить, как решить эту проблему для NavigationViewItem (s), я могу проверить версии Windows, я могу установить разные шаблоны для разных версий, но мой вопрос:

Как я могу предоставить список ICollectionDataItem для NavigationView, а затем преобразовать его в NavigationViewItem (s) и NavigationViewItemHeader (s), используя xaml, и гарантировать одинаковое поведение в Windows 10 1803 и 1809 (я не претендую на использование предыдущих версий) ? 

Может быть, вы думаете, что ответ очевиден, попробуйте сами, и вы увидите.

Я действительно разочарован этой проблемой; любая помощь будет оценена.

Заранее спасибо

4
Leisvan

Помимо использования SplitView и реализации вашей пользовательской навигации (что в основном и делает NavigationView), я не вижу никаких других решений - как описано выше, это ошибка на уровне операционной системы.

2
Ivan Ičin

Я проверил последнюю версию NavigationView. И это имеет много новых функций, таких как верхнее размещение. Мы добавляем класс NavigationViewItemPresenter для новой NavigationView. Конечно, мы предлагаем вам использовать самую последнюю версию NavigationView. если вы хотите, чтобы он имел одинаковый внешний вид в другой целевой версии. Вы можете использовать NavigationView из Community Tool Kit

1
Nico Zhu - MSFT