2011-04-14 10 views
1

キーボードを使用してフォーム内でカスタム(ユーザー)コントロールを移動する必要があります。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 ' 

答えて

1

2つのこと:あなたがイベントを渡している場合は、trueにe.Handled

  1. を設定します。これにより、他のものがキーストロークに反応するのを防ぐことができます。

  2. すべての祖先のコントロールでKeyboardNavigation.DirectionalNavigationの設定で遊ぶ必要があるかもしれません。矢印キーはデフォルトでキーボードフォーカスを移動しますが、これはDirectionalNavigation設定に基づいています。あなたはNoneに設定したいと思うでしょうが、これは#1が問題を解決しないと仮定しています。

+0

設定は本当に助けになりました。ありがとう! – serhio

関連する問題