При нажатии на ярлык, чтобы сосредоточить другой элемент управления в WPF - PullRequest
13 голосов
/ 29 апреля 2011

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

 <StackPanel>
    <Label Target="TextBox1">Label Text</Label>
    <TextBox Name="TextBox1" />
</StackPanel>

Когда пользователь нажимает на «Текст метки», я хочу, чтобы текстовое поле получало фокус. Возможно ли это?

Ответы [ 4 ]

15 голосов
/ 29 апреля 2011

Вы должны использовать свойство Target:

<Label Content="_Stuff:" Target="{x:Reference TextBox1}"
       MouseLeftButtonUp="Label_MouseLeftButtonUp"/>
<TextBox Name="TextBox1" />
private void Label_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    if (e.ClickCount == 1) //Note that this is a lie, this does not check for a "real" click
    {
        var label = (Label)sender;
        Keyboard.Focus(label.Target);
    }
}

Весь смысл использования Label в первую очередь вместо TextBlock заключается в использовании его ассоциативной функциональности, см. Ссылку в MSDN .

О моей заметке я задал вопрос о том, как получить реальный клик здесь , если вам интересно.

2 голосов
/ 29 апреля 2011

Я нашел код, который использовал для этого, и подумал, что поделюсь им, если он пригодится кому-то еще.

public class LabelEx : Label
{
    protected override void OnMouseLeftButtonDown(MouseButtonEventArgs e)
    {
        if (Target != null)
        {
            Target.Focus();
        }
    }
}
1 голос
/ 29 апреля 2011

вы не можете сделать это с помощью комбинации клавиш быстрого доступа

    <Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
        <ColumnDefinition></ColumnDefinition>
    </Grid.ColumnDefinitions>
    <Label Target="{Binding ElementName=textbox1}" Content="_Name"/>
    <TextBox Name="textbox1" Height="25" Grid.Column="1" VerticalAlignment="Top"/>
</Grid> 
0 голосов
/ 29 апреля 2011

На основании чтения WPF-метки для атрибута "for" HTML , для этого вам понадобится присоединенное поведение.

...