2011-03-30 65 views
1

我有一个简单的TextBlock这样的(它必须是一个TextBlock):TextBlock HyperLink和Anchor?

<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> 

我想怎么办时,用户点击超链接的顶部,它会向下滚动锚上底部。这在WPF中甚至可能吗?

谢谢!

+0

锚所拥有的一切(除了新ICommand类) ,就像在HTML中(而不是Windows窗体)?我不这么认为。 – Marcote 2011-03-30 13:10:46

+0

是的,HTML锚点。 – SaphuA 2011-03-30 13:15:51

回答

2

您可以使用BringIntoView方法,该方法应该将您的scrollViewer滚动到您调用BringIntoViewFrameworkElement。下一步是将点击的超链接与目标超链接进行匹配。最直接的方法是使用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

+0

除非有人使用仅限XAML的解决方案,否则这将是我将前往的方向。谢谢! – SaphuA 2011-03-31 07:16:31

+0

@SaphuA,增加了另一种解决方案,它有更多的XAML和更少的代码隐藏 – Snowbear 2011-03-31 08:10:09

+0

这更加棒! – SaphuA 2011-04-06 11:38:40

0

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

+0

TargetName的任何替代品都可以;)我只从我的测试代码复制了TargetName,这是我感兴趣的方法。 – SaphuA 2011-03-30 13:16:20

+1

我不知道任何替代品,如果全部失败,您可以处理单击事件,按名称查找目标元素,并在滚动查看器中调用一些滚动查看方法。 – 2011-03-30 13:20:07