キーボードを使用してフォーム内でカスタム(ユーザー)コントロールを移動する必要があります。WPFのカスタム(ユーザー)コントロールにフォーカスを当ててください
動作は単純です。ユーザーがコントロールをクリックした後、キーボード(up/d/l/r)を使用してコントロールを移動できます。
このサンプルでは、UserControlではなく、Canvasを使用します。
問題が...私は私のコントロールを「focalize」とき、または私が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;
}
}
}
ベローがダウン制御および3 "keyUpイベント" の上でマウスの後に実行ログです:
あなたが試すことができます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 '
設定は本当に助けになりました。ありがとう! – serhio