我正在努力做一个"跳到"在我的应用程序菜单。我希望它看起来和工作的方式就像在顶部的Google设计书here一样,你可以在菜单中找到该页面每个部分的字幕(确切地说,那个导航部分带有内容,基线网格,Keylines和间距等链接。如果可能的话,我希望它能够在没有将它分成新的MVVM视图的情况下工作,所有这些都在一个UserControl中。是否可以创建一些关键字,只需使用" goto" HTML中的链接?
<a href="#metrics-and-keylines-baseline-grids">Baseline Grids</a>
也许是自定义ScrollViewer?但是如何知道UI中每个元素的高度?
答案 0 :(得分:2)
每个框架元素都有BringIntoView方法。您可以定义超链接或按钮,菜单,以及能够调用命令的任何内容。该命令将元素作为参数,命令执行将调用BringIntoView();
一个简单的例子:
public class JumpToElementCommand : ICommand
{
public void Execute(object parameter)
{
FrameworkElement frameworkElement = parameter as FrameworkElement;
if (frameworkElement != null)
{
frameworkElement.BringIntoView();
}
}
public bool CanExecute(object parameter)
{
return parameter is FrameworkElement;
}
public event EventHandler CanExecuteChanged
{
add { CommandManager.RequerySuggested += value; }
remove { CommandManager.RequerySuggested -= value; }
}
}
Xaml用法:
<Window.Resources>
<commands:JumpToElementCommand x:Key="JumpToElementCommand" />
</Window.Resources>
<Button Command="{StaticResource JumpToElementCommand}" CommandParameter="{Binding ElementName=FirstJump}" />
<Grid x:Name="FirstJump">
</Grid>
编辑:添加了CommandManager.RequerySuggested,以便在加载后重新评估命令参数。
答案 1 :(得分:0)
现在(在Michael G的帮助下)我有了答案。
首先为菜单制作一个ihnerited面板(对我来说,它是父ItemsControl
StackPanel
主持人)。订阅ItemsControl
内的按钮项的所有Click事件。作为CommandParameter
绑定到要跳转到的元素:
<Button CommandParameter="{Binding ElementName=jumpTarget}"/>
在Click事件处理程序中,您使用的是here所提供的解决方案,而不是
Control_GotFocus(object sender, RoutedEventArgs e)
你像这里一样传递CommandParameter
:
Control_GotFocus(FrameworkElement targetControl)
您还必须获取父ScrollViewer
并将其作为AssociatedObject
放在上面的示例中(here说明如何获取所选类型的父级)。当然,您可以通过简单地使用添加了Button
中每个ItemsControl
的参数的命令来避免事件接收。