Событие KeyDown в гиперссылке wpf

Мне нужно выполнить некоторые операции с событием keydown в гиперссылке wpf.

У меня есть простой форматированный текст, в котором есть гиперссылка. Я хочу, чтобы событие Keydown запускалось только тогда, когда фокус находится на гиперссылке, то есть курсор находится на тексте гиперссылки.

Это не работает, и я не мог найти объяснения, почему это не работает.

<Hyperlink KeyDown="Hyperlink_KeyDown">
   test
</Hyperlink>

Я был бы очень признателен, если бы вы могли мне помочь.

Спасибо. Добрый день, Астиг.


person astig    schedule 16.03.2011    source источник


Ответы (1)


это не работает, потому что гиперссылка не распознается как сфокусированная, вы можете перехватить это событие в родительском контроле, например, в сетке, но прежде чем оно будет перехвачено, вы должны щелкнуть по нему.

Таким образом, вы можете поймать событие keydown окна следующим образом:

XAML:

<Window x:Class="WpfApplication3.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    Name="MW" KeyDown="MW_KeyDown">
<Grid>
    <TextBlock>
        <Hyperlink Name="HL1" NavigateUri="http://www.google.com/" RequestNavigate="HL1_RequestNavigate">
               Focus it and key down
        </Hyperlink>
    </TextBlock>
</Grid>

and code:

 private void MW_KeyDown(object sender, KeyEventArgs e)
    {
        if (HL1.IsMouseOver == true)
            HL1_RequestNavigate(HL1,new RequestNavigateEventArgs(HL1.NavigateUri, HL1.Name));
    }

    private void HL1_RequestNavigate(object sender, RequestNavigateEventArgs e)
    {
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
        e.Handled = true;
    }

Изменить

Также вы можете установить фокус на гиперссылку следующим образом:

XAML:

<Hyperlink Name="HL1" NavigateUri="http://www.google.com/" RequestNavigate="HL1_RequestNavigate" KeyDown="HL1_KeyDown" MouseEnter="HL1_MouseEnter">

код:

private void HL1_RequestNavigate(object sender, RequestNavigateEventArgs e)
    {
        Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
        e.Handled = true;
    }

    private void HL1_KeyDown(object sender, KeyEventArgs e)
    {
        HL1_RequestNavigate(HL1, new RequestNavigateEventArgs(HL1.NavigateUri, HL1.Name));
    }

    private void HL1_MouseEnter(object sender, MouseEventArgs e)
    {
        HL1.Focus();
    }
person Sonorx    schedule 18.03.2011