Скажем, мне нужно переместить пользовательский (пользовательский) элемент управления в форме с помощью клавиатуры.
Поведение простое: пользователь нажимает на элемент управления, затем он может переместить его с помощью клавиатуры (вверх/d/l/r).
В этом примере вместо UserControl я буду использовать Canvas.
Проблема в том, что когда я "фокусирую" свой элемент управления или теряю егопосле переворота «шагов» для textBox, или я не получаю его вообще ...
XAML:
<Window x:Class="WpfApplication14.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"
PreviewKeyDown="Window_PreviewKeyDown">
<Grid>
<TextBox Name="textBox1"
Margin="91,66,292,223" Width="120"
Text="Good morning, miss Hilton!"/>
<Canvas Name="canvas1" Focusable="True"
Margin="124,112,179,99" Width="200"
Background="AliceBlue"
MouseDown="canvas1_MouseDown"
PreviewKeyDown="canvas1_PreviewKeyDown" />
</Grid>
</Window>
CS:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void canvas1_MouseDown(object sender, MouseButtonEventArgs e)
{
Console.WriteLine("canvas_MouseDown 0, canvas1.IsFocused? {0}",
canvas1.IsFocused);
canvas1.Focus();
Console.WriteLine("canvas_MouseDown 1, canvas1.IsFocused? {0}",
canvas1.IsFocused);
}
private void canvas1_PreviewKeyDown(object sender, KeyEventArgs e)
{
Console.WriteLine("canvas_PreviewKeyDown, canvas1.IsFocused? {0}",
canvas1.IsFocused);
if (canvas1.IsFocused)
MoveCanvas(e.Key);
}
private void Window_PreviewKeyDown(object sender, KeyEventArgs e)
{
//Console.WriteLine("Window_PreviewKeyDown, canvas1.IsFocused? {0}",
// canvas1.IsFocused);
//if (canvas1.IsFocused)
// MoveCanvas(e.Key);
}
void MoveCanvas(Key key)
{
int delta = 10;
switch (key)
{
case Key.Left: canvas1.Margin = new Thickness(
canvas1.Margin.Left - delta,
canvas1.Margin.Top,
canvas1.Margin.Right,
canvas1.Margin.Bottom);
break;
case Key.Up: canvas1.Margin = new Thickness(
canvas1.Margin.Left,
canvas1.Margin.Top - delta,
canvas1.Margin.Right,
canvas1.Margin.Bottom + delta);
break;
case Key.Right: canvas1.Margin = new Thickness(
canvas1.Margin.Left,
canvas1.Margin.Top,
canvas1.Margin.Right - delta,
canvas1.Margin.Bottom);
break;
case Key.Down: canvas1.Margin = new Thickness(
canvas1.Margin.Left,
canvas1.Margin.Top + delta,
canvas1.Margin.Right,
canvas1.Margin.Bottom - delta);
break;
default:
break;
}
}
}
Ниже приведен журнал выполнения после нажатия кнопки мыши на элементе управления и трех нажатий клавиш:
canvas_MouseDown 0, canvas1.IsFocused? False ' before click '
canvas_MouseDown 1, canvas1.IsFocused? True ' after click '
Window_PreviewKeyDown, canvas1.IsFocused? True ' up 1 '
canvas_PreviewKeyDown, canvas1.IsFocused? True ' up 1 '
Window_PreviewKeyDown, canvas1.IsFocused? False ' up 2 '
Window_PreviewKeyDown, canvas1.IsFocused? False ' up 3 '