Вы можете использовать BringIntoView метод, который должен прокрутить ваш scrollViewer до 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();
}
Это в основном реализация идеи HB из его комментария.
Еще одно решение, которое мне пришло в голову.Если вы хотите переместить больше кода в 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>
Это позволит вам иметь все (кроме нового ICommand
класса)в XAML