Есть ли способ установить Focus
от одного управления до другого использования WPF Trigger
s?
Как следующий пример:
<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.
Вы не думали о том, чтобы использовать прикрепленное поведение. Они просты в реализации и использовании 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" />
Я не нахожусь рядом с визуальной студией, поэтому я не могу сейчас попробовать это, но, черт возьми, у вас должно получиться что-то вроде этого:
FocusManager.FocusedElement="{Binding ElementName=txtName}">
Изменить:
Здесь есть дополнительный вопрос (заданный совсем недавно): Как установить автофокус только в xaml? , который содержит этот метод и несколько различных идей о том, как его использовать.
Ты этого хочешь?
<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
}