![](/img/trans.png)
[英]UWP NavigationView Foreground colour for the previously selected items does not update when selecting another item
[英]Scroll to selected item in NavigationView UWP
我需要将NavigationView
滚动到其SelectedItem
。 在其中我尝试了以下方法,一种是TryMoveFocusAsync
,另一种是通过从SelectionChanged
事件中通过SelectedItem
的父项获取ScrollViewer
。 但是,父母似乎是 null。
注意: NavigationView 没有像ListView
这样的ScrollIntoView
第一种方法
private async void OnSelectionChanged(
NavigationView sender, NavigationViewSelectionChangedEventArgs args)
{
if (args.SelectedItem is NavigationViewItem item)
{
FocusManager.TryFocusAsync(
sender.SelectedItem as DependencyObject,
FocusState.Pointer);
ViewModel.NavigateTo(item.Name);
}
UpdateBackButton();
}
第二种方法
private async void OnSelectionChanged(
NavigationView sender, NavigationViewSelectionChangedEventArgs args)
(args.SelectedItem as NavigationViewItem).Parent
返回 null。
有没有办法将NavigationViewMenuItem
滚动到其选定的索引?
因为ScrollIntoView
便利方法在ListView
之外不可用,所以要完成这项工作需要做更多的工作。 首先,我们需要编写一个辅助方法,使用VisualTreeHelper
查找DependencyObject
的父对象:
private T FindParentOfType<T>(DependencyObject item)
{
while (item != null)
{
item = VisualTreeHelper.GetParent(item);
if (item is T expectedParent)
{
return expectedParent;
}
}
return default;
}
现在使用它,我们首先找到ScrollViewer
(它应该是NavigationViewItem
的祖父):
var scrollViewer = FindParentOfType<ScrollViewer>(item);
我们现在需要在滚动查看器中找出此菜单项的 position,这可以使用TransformToVisual
和TransformPoint
来完成。 知道了这个垂直位置,我们现在可以使用ScrollViewer.ChangeView
方法滚动到它:
if (scrollViewer != null)
{
var transform =
item.TransformToVisual(scrollViewer)
.TransformPoint(new Point(0,0));
scrollViewer.ChangeView(null, transform.Y, null);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.