首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TextBlock HyperLink和主播?

TextBlock HyperLink和主播?
EN

Stack Overflow用户
提问于 2011-03-30 21:05:44
回答 2查看 2.1K关注 0票数 1

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

代码语言:javascript
复制
<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时,它将向下滚动底部的锚。这在WPF中是可能的吗?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-03-30 21:29:00

您可以使用BringIntoView方法,该方法会将scrollViewer滚动到调用BringIntoViewFrameworkElement。下一步是将点击的超链接与目标超链接进行匹配。最直接的方法是使用Dictionary。最后一步是处理Hyperlink.Click事件。

代码隐藏:

代码语言:javascript
复制
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中,你可以创建一个命令,它将导航到作为参数传递的元素。下面是一个命令类:

代码语言:javascript
复制
class NavigateToCommand : ICommand
{
    public void Execute(object parameter)
    {
        ((FrameworkElement)parameter).BringIntoView();
    }

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

    public event EventHandler CanExecuteChanged;
}

您可以在示例中使用它,如下所示:

代码语言:javascript
复制
<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类)。

票数 2
EN

Stack Overflow用户

发布于 2011-03-30 21:13:30

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5486679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档