windows - 在 NavView 导航窗格 UWP 中使用命令栏
问题描述
我正在努力创建我脑海中的 UI,到目前为止还相当不成功。
我正在尝试创建一个托管我的 NavView 的主页,并且在 NavView 内部我希望有一个命令栏来控制哪些 NavViewItems 是可见的。我已经创建了我想要实现的目标的快速图像。
在我的示例中,我激活了命令栏中的主页按钮,显示
- 导航项目标题
- 导航项 1
- ETC...
我希望能够单击文档并让指示器切换到文档并隐藏与 Home 对应的导航项并显示与 Documents 对应的导航项。
最后,我希望在 NavView 窗格紧凑时命令栏折叠,但用户应该能够单击命令栏按钮并展开命令栏以在主页、文档等之间进行切换。
真正寻找最佳起点的任何帮助/建议。
我还在学习 UWP 控件和 Xaml。
解决方案
我认为您应该使用 aSplitView
而不是NavigationView
外部,然后在内部Pane
使用Splitview
aNavigationView
和一些技巧来实现您想要的。
要点是:
- 保持
NavigationView
'sPaneDisplayMode
LeftComact
- 不要使用
PaneToggleButton
中的NavigationView
来防止用户PaneDisplayMode
通过单击来更改它,而是使用自定义的来打开和关闭窗格。 - 将 的更改为
PaneDisplayMode
窗格打开时,并NavigationView
在窗格关闭时再次返回。Top
LeftComact
这是我在NavigationView
inside中取得的成就Splitview.Pane
:
您可以装饰它并使其在视觉上更令人满意,例如添加一个AutoSuggestBox
或Setting
按钮,但这是基本的。顺便说一句,不要使用NavigationView
'Setting
按钮,因为我在这里看到它的行为很奇怪。
XAML:
<SplitView
x:Name="Split"
DisplayMode="CompactInline"
CompactPaneLength="40">
<SplitView.Pane>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition />
</Grid.RowDefinitions>
<Button
Click="Button_Click">
<SymbolIcon Symbol="List"/>
</Button>
<NavigationView
Grid.Row="1"
x:Name="NavView"
PaneDisplayMode="LeftCompact"
CompactPaneLength="{x:Bind Split.CompactPaneLength}"
IsBackButtonVisible="Collapsed"
IsPaneToggleButtonVisible="False"
IsSettingsVisible="False"
SelectionChanged="NavView_SelectionChanged">
<NavigationView.MenuItems>
<NavigationViewItem x:Name="HomeItem" Icon="Home" VerticalAlignment="Stretch"/>
<NavigationViewItem x:Name="DocumentItem" Icon="Document" />
<NavigationViewItem x:Name="PeopleItem" Icon="People" />
</NavigationView.MenuItems>
<ContentControl>
<ListView
x:Name="ItemList"/>
</ContentControl>
</NavigationView>
</Grid>
</SplitView.Pane>
</SplitView>
后面的代码:
public sealed partial class MainPage : Page
{
public List<string> HomeItemList;
public List<string> DocumentItemList;
public List<string> PeopleItemList;
public MainPage()
{
InitializeComponent();
HomeItemList = new List<string> { "HomeItem1", "HomeItem2", "HomeItem3" };
DocumentItemList = new List<string> { "DocumentItem1", "DocumentItem2", "DocumentItem3" };
PeopleItemList = new List<string> { "PeopleItem1", "PeopleItem2", "PeopleItem3" };
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Split.IsPaneOpen = !Split.IsPaneOpen;
if (Split.IsPaneOpen)
{
NavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
}
else NavView.PaneDisplayMode = NavigationViewPaneDisplayMode.LeftCompact;
}
private void NavView_SelectionChanged(NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (args.SelectedItem != null)
{
Split.IsPaneOpen = true;
NavView.PaneDisplayMode = NavigationViewPaneDisplayMode.Top;
if (sender.SelectedItem == HomeItem)
ItemList.ItemsSource = HomeItemList;
else if(sender.SelectedItem == DocumentItem)
ItemList.ItemsSource = DocumentItemList;
else if(sender.SelectedItem == PeopleItem)
ItemList.ItemsSource = PeopleItemList;
}
}
}
希望有帮助。
推荐阅读
- ios - Unity iOS 构建大小巨大但纹理小
- java - 如果我们添加正确的jar引用,为什么Spring boot不支持jsp而它可以呈现页面
- javascript - 如何动态地将数据传递给选择列表?
- google-sheets-api - batchUpdate 调用如何计入使用限制?
- node.js - 如何在 express.js 中从表单发布数据?
- postgresql - 更新变更集时出现复合唯一约束错误
- c# - 如何在 Podio 应用程序中获取所有 FieldId(即使某些字段为空)
- react-native - 如何修复 undefined is not an object (evalating 'Component.router.getStateForAction') in React Native
- java - 如何使用 Spring Data JPA ORM 在运行时动态切换数据库
- php - 我想在函数中添加警报(或通知)