TextBlock HyperLink и Anchor? - PullRequest
       22

TextBlock HyperLink и Anchor?

1 голос
/ 30 марта 2011

У меня есть простой текстовый блок, подобный этому (это должен быть текстовый блок):

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

Спасибо!

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Вы можете использовать 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

0 голосов
/ 30 марта 2011

TargetName работает только для окон и фреймов в соответствии с MSDN, поэтому это невозможно.

...