我有一个像这样的简单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中使用吗?
谢谢!
答案 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的窗口和框架,所以这是不可能的。