跳转到UserControl内的导航

时间:2014-10-07 15:56:09

标签: wpf xaml

我正在努力做一个"跳到"在我的应用程序菜单。我希望它看起来和工作的方式就像在顶部的Google设计书here一样,你可以在菜单中找到该页面每个部分的字幕(确切地说,那个导航部分带有内容,基线网格,Keylines和间距等链接。如果可能的话,我希望它能够在没有将它分成新的MVVM视图的情况下工作,所有这些都在一个UserControl中。是否可以创建一些关键字,只需使用" goto" HTML中的链接?

<a href="#metrics-and-keylines-baseline-grids">Baseline Grids</a>

也许是自定义ScrollViewer?但是如何知道UI中每个元素的高度?

2 个答案:

答案 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的参数的命令来避免事件接收。