我有一个这样的简单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时,它将向下滚动底部的锚。这在WPF中是可能的吗?
谢谢!
发布于 2011-03-30 21:29:00
您可以使用BringIntoView方法,该方法会将scrollViewer滚动到调用BringIntoView的FrameworkElement。下一步是将点击的超链接与目标超链接进行匹配。最直接的方法是使用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类)。
发布于 2011-03-30 21:13:30
根据MSDN,TargetName只适用于窗口和框架,所以这是不可能的。
https://stackoverflow.com/questions/5486679
复制相似问题