TextBlock HyperLink和Anchor?

时间:2011-03-30 13:05:44

标签: wpf hyperlink anchor textblock

我有一个像这样的简单TextBlock(它必须是一个TextBlock):

<ScrollViewer Height="50" VerticalAlignment="Top">
<TextBlock>
    <Hyperlink TargetName="TestAnchor">Test</Hyperlink><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <TextBlock Text="Line" /><LineBreak />
    <Hyperlink Name="TestAnchor" />
</TextBlock>
</ScrollViewer>

我想要做的是当用户点击顶部的HyperLink时,它会向下滚动底部的Anchor。这甚至可以在WPF中使用吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您可以使用BringIntoView方法将滚动查看器滚动到您调用的FrameworkElement BringIntoView。下一步是将点击的超链接与目标超链接相匹配。最简单的方法是使用Dictionary。最后一步是处理Hyperlink.Click事件。

代码背后:

private readonly Dictionary<Hyperlink,FrameworkElement> HyperlinkTargets = 
                    new Dictionary<Hyperlink,FrameworkElement>();

public Constructor()
{
    InitializeComponent();
    HyperlinkTargets.Add(TestHyperlink, TestAnchor);
}

// this event handler should be attached to hyperlinks which will be used for navigation
private void Hyperlink_Click(object sender, RoutedEventArgs e)
{
    var clickedHyperlink = (Hyperlink)sender;
    var targetHyperlink = HyperlinkTargets[clickedHyperlink];
    targetHyperlink.BringIntoView();
}

这基本上是他评论中 H.B.的想法的实现。


我想到的另一个解决方案。如果要将更多代码移动到XAML中,可以创建一个命令,该命令将导航到作为参数传递的元素。这是一个命令类:

class NavigateToCommand : ICommand
{
    public void Execute(object parameter)
    {
        ((FrameworkElement)parameter).BringIntoView();
    }

    public bool CanExecute(object parameter)
    {
        return parameter is FrameworkElement;
    }

    public event EventHandler CanExecuteChanged;
}

您可以在样本中使用它:

<ScrollViewer Height="50" VerticalAlignment="Top">
<ScrollViewer.Resources>
     <local:NavigateToCommand x:Key="navigateToCommand" />
</ScrollViewer.Resources>
<TextBlock>
    <Hyperlink Command="{StaticResource navigateToCommand}"
               CommandParameter="{Binding ElementName=TestAnchor}">Test</Hyperlink><LineBreak />
    /* TextBlocks */
    <Hyperlink Name="TestAnchor" />
</TextBlock>
</ScrollViewer>   

这将允许您在XAML中拥有所有内容(新ICommand类除外)

答案 1 :(得分:0)

TargetName仅适用于根据MSDN的窗口和框架,所以这是不可能的。