经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » ASP.net » 查看文章
UWP 2018 新版 NavigationView 尝鲜
来源:cnblogs  作者:星期八再娶你  时间:2018/9/25 20:40:46  对本文有异议

本文参考了官方文档以及提供的示例代码(官方代码貌似有点误导,所以写了这一篇,并且文末有GayHub代码地址)

官方文档发布于20180806,说明NavigationView刚发布了没几天,还在开发中,所以里面的接口啥的随时会变! 随时会变! 随时会变! ,用在你的项目之前,请需要做好充足的心理准备。

 

不过他变任他变,效果还是非常诱人的。看一下效果图

 

 

 

2018 新版 NavigationView实现了汉堡菜单和顶部菜单的近乎完美结合,可以参考官方商店的设计风格,就是用的这个控件。

不过要用这个控件,也不是那么容易的,因为他需要Windows UI Library支持,而这个库不支持VS2015,必须是2017或者更高版本。详见  Getting started with the Windows UI Library

下面就说一下实现的完整步骤吧。

 

1.安装Microsoft.UI.Xaml

在NuGet中搜索Microsoft.UI.Xaml,需要勾选预发行版本。

然后需要将Microsoft.UI.Xaml添加到应用程序资源。

a. 如果你程序没有其他的程序资源,那么

  1. <Application>
  2. <Application.Resources>
  3. <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
  4. </Application.Resources>
  5. </Application>

b. 如果已存在其他的,那么只需要合并一下即可

  1. <Application>
  2. <Application.Resources>
  3. <ResourceDictionary>
  4. <ResourceDictionary.MergedDictionaries>
  5. <XamlControlsResources xmlns="using:Microsoft.UI.Xaml.Controls"/>
  6. </ResourceDictionary.MergedDictionaries>
  7. </ResourceDictionary>
  8. </Application.Resources>
  9. </Application>

 

 

2. 添加引用

在xaml文件中,添加

  1. xmlns:controls="using:Microsoft.UI.Xaml.Controls"

在.cs文件中添加

  1. using MUXC = Microsoft.UI.Xaml.Controls;

 

 

3. 编写Xaml界面

注意一下被注释掉的代码,你可以反注释一下,看看效果。

我这里主要是模仿一下商店的风格。

代码和官方的不大一样,主要是控件NavigationView,官方并没有在前面加上命名空间controls,我这里加上了。如果不加的话,编译器并不知道i用的是新版的控件。后台代码如果不加的话,会爆出N个错误。

详见我的Issue Developers and VS may get confused with namespace Microsoft.UI.Xaml.Controls and Windows.UI.Xaml.Controls

  1. <Grid>
  2. <VisualStateManager.VisualStateGroups>
  3. <VisualStateGroup>
  4. <VisualState>
  5. <VisualState.StateTriggers>
  6. <AdaptiveTrigger MinWindowWidth="{x:Bind NavView.CompactModeThresholdWidth}" />
  7. </VisualState.StateTriggers>
  8.  
  9. <VisualState.Setters>
  10. <Setter Target="NavView.PaneDisplayMode" Value="Top"/>
  11. </VisualState.Setters>
  12. </VisualState>
  13. </VisualStateGroup>
  14. </VisualStateManager.VisualStateGroups>
  15.  
  16. <controls:NavigationView x:Name="NavView"
  17. SelectionFollowsFocus="Enabled"
  18. ItemInvoked="NavView_ItemInvoked"
  19. IsSettingsVisible="True"
  20. Loaded="NavView_Loaded"
  21. BackRequested="NavView_BackRequested">
  22. <controls:NavigationView.MenuItems>
  23. <controls:NavigationViewItem Content="Home" x:Name="home" Tag="home">
  24. <controls:NavigationViewItem.Icon>
  25. <FontIcon Glyph="&#xE10F;"/>
  26. </controls:NavigationViewItem.Icon>
  27. </controls:NavigationViewItem>
  28. <!--<controls:NavigationViewItemSeparator/>-->
  29. <!--<controls:NavigationViewItemHeader Content="Main pages"/>-->
  30. <controls:NavigationViewItem Icon="AllApps" Content="Apps" x:Name="apps" Tag="apps"/>
  31. <controls:NavigationViewItem Icon="People" Content="Games" x:Name="games" Tag="games"/>
  32. <controls:NavigationViewItem Icon="Video" Content="Movies and TVs" x:Name="moviestvs" Tag="moviestvs"/>
  33. <controls:NavigationViewItem Icon="Audio" Content="Music" x:Name="music" Tag="music"/>
  34. <controls:NavigationViewItem Icon="PhoneBook" Content="Books" x:Name="books" Tag="books"/>
  35. </controls:NavigationView.MenuItems>
  36.  
  37. <!--<controls:NavigationView.AutoSuggestBox>
  38. <AutoSuggestBox x:Name="ASB" QueryIcon="Find"/>
  39. </controls:NavigationView.AutoSuggestBox>-->
  40.  
  41. <!--<controls:NavigationView.HeaderTemplate>
  42. <DataTemplate>
  43. <Grid Margin="24,10,0,0">
  44. <Grid.ColumnDefinitions>
  45. <ColumnDefinition Width="Auto"/>
  46. <ColumnDefinition/>
  47. </Grid.ColumnDefinitions>
  48. <TextBlock Style="{StaticResource TitleTextBlockStyle}"
  49. FontSize="28"
  50. VerticalAlignment="Center"
  51. Text="Welcome"/>
  52. <CommandBar Grid.Column="1"
  53. HorizontalAlignment="Right"
  54. VerticalAlignment="Top"
  55. DefaultLabelPosition="Right"
  56. Background="{ThemeResource SystemControlBackgroundAltHighBrush}">
  57. <AppBarButton Label="Refresh" Icon="Refresh"/>
  58. <AppBarButton Label="Import" Icon="Import"/>
  59. </CommandBar>
  60. </Grid>
  61. </DataTemplate>
  62. </controls:NavigationView.HeaderTemplate>-->
  63.  
  64. <Frame x:Name="ContentFrame"/>
  65. </controls:NavigationView>
  66.  
  67. <TextBlock Text="New Navigation View" FontSize="12" Margin="12,6,0,0" HorizontalAlignment="Left" VerticalAlignment="Top"/>
  68. </Grid>

 

 

4. 添加后台代码

首先添加一下必要的引用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Windows.Foundation;
  5. using Windows.System;
  6. using Windows.UI.ViewManagement;
  7. using Windows.UI.Xaml;
  8. using Windows.UI.Xaml.Controls;
  9. using Windows.UI.Xaml.Input;
  10. using Windows.UI.Xaml.Navigation;
  11. using MUXC = Microsoft.UI.Xaml.Controls;

 

红色代码部分是我自己添加的,官方没有。

因为发现当初与设置界面的时候,拖动窗体改变大小,app会崩溃。目前已经提交官方pr,等待审核

 

  1. private Type currentPage;
  2. // List of ValueTuple holding the Navigation Tag and the relative Navigation Page
  3. private readonly IList<(string Tag, Type Page)> _pages = new List<(string Tag, Type Page)>
  4. {
  5. ("home", typeof(HomePage)),
  6. ("apps", typeof(AppsPage)),
  7. ("games", typeof(GamesPage)),
  8. ("moviestvs", typeof(MovieandTVPage)),
  9. ("music", typeof(MusicPage)),
  10. ("books", typeof(BooksPage)),
  11. };
  12. private void NavView_Loaded(object sender, RoutedEventArgs e)
  13. {
  14. // You can also add items in code behind
  15. //NavView.MenuItems.Add(new NavigationViewItemSeparator());
  16. //NavView.MenuItems.Add(new NavigationViewItem
  17. //{
  18. // Content = "Settings",
  19. // Icon = new SymbolIcon(Symbol.Folder),
  20. // Tag = "content"
  21. //});
  22. //_pages.Add(("content", typeof(SettingsPage)));
  23. ContentFrame.Navigated += On_Navigated;
  24. // NavView doesn't load any page by default: you need to specify it
  25. NavView_Navigate("home");
  26. // Add keyboard accelerators for backwards navigation
  27. var goBack = new KeyboardAccelerator { Key = VirtualKey.GoBack };
  28. goBack.Invoked += BackInvoked;
  29. this.KeyboardAccelerators.Add(goBack);
  30. // ALT routes here
  31. var altLeft = new KeyboardAccelerator
  32. {
  33. Key = VirtualKey.Left,
  34. Modifiers = VirtualKeyModifiers.Menu
  35. };
  36. altLeft.Invoked += BackInvoked;
  37. this.KeyboardAccelerators.Add(altLeft);
  38. }
  39. private void NavView_ItemInvoked(MUXC.NavigationView sender, MUXC.NavigationViewItemInvokedEventArgs args)
  40. {
  41. if (args.InvokedItem == null)
  42. return;
  43. if (args.IsSettingsInvoked)
  44. ContentFrame.Navigate(typeof(SettingsPage));
  45. else
  46. {
  47. // Getting the Tag from Content (args.InvokedItem is the content of NavigationViewItem)
  48. var navItemTag = NavView.MenuItems
  49. .OfType<MUXC.NavigationViewItem>()
  50. .First(i => args.InvokedItem.Equals(i.Content))
  51. .Tag.ToString();
  52. NavView_Navigate(navItemTag);
  53. }
  54. }
  55. private void NavView_Navigate(string navItemTag)
  56. {
  57. var item = _pages.First(p => p.Tag.Equals(navItemTag));
  58. if (currentPage == item.Page)
  59. return;
  60. ContentFrame.Navigate(item.Page);
  61. currentPage = item.Page;
  62. }
  63. private void NavView_BackRequested(MUXC.NavigationView sender, MUXC.NavigationViewBackRequestedEventArgs args)
  64. {
  65. On_BackRequested();
  66. }
  67. private void BackInvoked(KeyboardAccelerator sender, KeyboardAcceleratorInvokedEventArgs args)
  68. {
  69. On_BackRequested();
  70. args.Handled = true;
  71. }
  72. private bool On_BackRequested()
  73. {
  74. if (!ContentFrame.CanGoBack)
  75. return false;
  76. // Don't go back if the nav pane is overlayed
  77. if (NavView.IsPaneOpen &&
  78. (NavView.DisplayMode == MUXC.NavigationViewDisplayMode.Compact ||
  79. NavView.DisplayMode == MUXC.NavigationViewDisplayMode.Minimal))
  80. return false;
  81. ContentFrame.GoBack();
  82. return true;
  83. }
  84. private void On_Navigated(object sender, NavigationEventArgs e)
  85. {
  86. NavView.IsBackEnabled = ContentFrame.CanGoBack;
  87. if (ContentFrame.SourcePageType == typeof(SettingsPage))
  88. {
  89. // SettingsItem is not part of NavView.MenuItems, and doesn't have a Tag
  90. NavView.SelectedItem = (MUXC.NavigationViewItem)NavView.SettingsItem;
  91. }
  92. else
  93. {
  94. var item = _pages.First(p => p.Page == e.SourcePageType);
  95. NavView.SelectedItem = NavView.MenuItems
  96. .OfType<MUXC.NavigationViewItem>()
  97. .First(n => n.Tag.Equals(item.Tag));
  98. }
  99. }

 

 

如果你发现,代码中

  1. IList<(string Tag, Type Page)> _pages = new List<(string Tag, Type Page)>

报错,请在NuGet中安装 System.ValueTuple

 

 

5. 延申扩展

商店还有一个效果,就是ScrollViewer向下拉的时候,再导航栏下面会有一个模糊的玻璃效果。

 

 

这个效果官方也做了说明,参考

Scroll content under top pane

不过我的程序中没做上去,因为 ScrollViewer的  CanContentRenderOutsideBounds  这个属性,再17134中并没有,应该在 Insider 17723出现了。

详见

Windows 10 SDK Preview Build 17723 available now! JULY 31, 2018 10:36 AM

 但是不晓得这个属性,会不会照顾低版本系统呢。。。。。。又是一个坑!!!

我在HomePage里面注释了,预览版可以尝试一下。

 

  1. <ScrollViewer>
  2. <!--<ScrollViewer CanContentRenderOutsideBounds"True">-->
  3. <StackPanel>
  4. <TextBlock FontSize="30" TextWrapping="Wrap" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center">
  5. <Run>For a seamless look+feel, if your app has pages that use a ScrollViewer and your navigation pane is top positioned, we recommend having the content scroll underneath the top nav pane.
  6. This can be achieved by setting the CanContentRenderOutsideBounds property on the relevant ScrollViewer to true.</Run>
  7. </TextBlock>
  8. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  9. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  10. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  11. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  12. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  13. <TextBlock Text="Home" FontSize="100" Margin="0,100,0,0" IsColorFontEnabled="True" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  14. </StackPanel>
  15. </ScrollViewer>

 

 

 

6. 再延申扩展一下

官方还说 Microsoft.UI.Xaml 支持更低的系统版本,最低支持到14393。但是在编译程序的时候,目标系统一定要是17134或者更高。

有低版本的系统,你可以在低版本上跑一下看看。反正半个月前是不能运行的,我测试过。

不过你的实际程序可能还有其他的官方库,那些有的可能最低是16299,所以14393也只是一个水中月而已。

 

 

7. GayHub项目地址

https://github.com/hupo376787/NewNavigationView

 

 

参考官方文档:

Windows UI Library (Preview version)

Navigation view (Preview version)

Windows 10 SDK Preview Build 17723 available now! JULY 31, 2018 10:36 AM

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号