WPF - Фокус Набора, когда кнопка нажата - Никакой Код Позади

Есть ли способ установить Focus от одного управления до другого использования WPF Triggers?

Как следующий пример:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
    <Grid.RowDefinitions>
      <RowDefinition/>
      <RowDefinition/>
      <RowDefinition/>
    </Grid.RowDefinitions>

    <TextBox Name="txtName"></TextBox>    
    <TextBox Grid.Row="1" Name="txtAddress"></TextBox>
    <Button Grid.Row="2" Content="Finish">
        <Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">

                <!-- Insert cool code here-->  

            </EventTrigger>
        </Button.Triggers>
    </Button>
  </Grid>
</Page>

Есть ли путь к этому EventTrigger помещать, чтобы сфокусироваться на текстовом поле "txtName"?

Я пытаюсь найти способ сделать что-то вроде этого с помощью строгого MVVM. Если это - что-то, что не должно быть сделано через XAML (в MVVM) затем, это прекрасно. Но я хотел бы видеть некоторую документацию относительно того, как она помещается в шаблон MVVM, делающий его вне XAML.

25
задан Dave Clemmer 18 September 2011 в 17:51
поделиться

3 ответа

Вы не думали о том, чтобы использовать прикрепленное поведение. Они просты в реализации и использовании AttachedProperty's. Несмотря на то, что код все равно требует наличия кода, он абстрагируется в классе и может быть использован повторно. Они могут устранить необходимость 'код позади' и часто используются с паттерном MVVM.

Попробуйте этот и посмотрите, работает ли он на вас.

public class EventFocusAttachment
{
    public static Control GetElementToFocus(Button button)
    {
        return (Control)button.GetValue(ElementToFocusProperty);
    }

    public static void SetElementToFocus(Button button, Control value)
    {
        button.SetValue(ElementToFocusProperty, value);
    }

    public static readonly DependencyProperty ElementToFocusProperty =
        DependencyProperty.RegisterAttached("ElementToFocus", typeof(Control), 
        typeof(EventFocusAttachment), new UIPropertyMetadata(null, ElementToFocusPropertyChanged));

    public static void ElementToFocusPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        var button = sender as Button;
        if (button != null)
        {
            button.Click += (s, args) =>
                {
                    Control control = GetElementToFocus(button);
                    if (control != null)
                    {
                        control.Focus();
                    }
                };
        }
    }
}

А затем в вашем XAML сделайте что-нибудь вроде...

<Button 
    Content="Click Me!" 
    local:EventFocusAttachment.ElementToFocus="{Binding ElementName=textBox}" 
    />
<TextBox x:Name="textBox" />
32
ответ дан 28 November 2019 в 18:19
поделиться

Я не нахожусь рядом с визуальной студией, поэтому я не могу сейчас попробовать это, но, черт возьми, у вас должно получиться что-то вроде этого:

FocusManager.FocusedElement="{Binding ElementName=txtName}">

Изменить:

Здесь есть дополнительный вопрос (заданный совсем недавно): Как установить автофокус только в xaml? , который содержит этот метод и несколько различных идей о том, как его использовать.

16
ответ дан 28 November 2019 в 18:19
поделиться

Ты этого хочешь?

    <TextBox Name="txtName"></TextBox>
    <TextBox Grid.Row="1" Name="txtAddress"></TextBox>
    <Button Grid.Row="2" Content="Finish">
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <EventSetter Event="Click" Handler="MoveFocusOnClick" />
            </Style>
        </Button.Style>
        <!--<Button.Triggers>
            <EventTrigger RoutedEvent="Button.Click">
            </EventTrigger>
        </Button.Triggers>-->
    </Button>

c#:

    public void MoveFocusOnClick(object sender, RoutedEventArgs e)
    {
        Keyboard.Focus(txtName); // Or your own logic
    }
1
ответ дан 28 November 2019 в 18:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: