Событие KeyDown в гиперссылке wpf - PullRequest
1 голос
/ 16 марта 2011

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

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

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

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

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

Спасибо. Хорошего дня, Astig.

1 Ответ

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

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

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>

и код:

 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();
    }
...