У меня есть элемент управления внутри холста, и я хочу иметь возможность перемещать его с помощью клавиш со стрелками.Для этого я создал следующий класс, который делает то, что я хочу.
<Window x:Class="DiagramDesigner.CanvasControlArrowKeyTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CanvasControlArrowKeyTest" Height="300" Width="300">
<Canvas>
<Canvas.InputBindings>
<KeyBinding Key="Down" Command="MoveDown" />
<KeyBinding Key="Up" Command="MoveUp" />
<KeyBinding Key="Right" Command="MoveRight" />
<KeyBinding Key="Left" Command="MoveLeft" />
</Canvas.InputBindings>
<Button>
<Button.CommandBindings>
<CommandBinding Command="MoveDown" Executed="MoveDown_Executed" />
<CommandBinding Command="MoveUp" Executed="MoveUp_Executed" />
<CommandBinding Command="MoveLeft" Executed="MoveLeft_Executed" />
<CommandBinding Command="MoveRight" Executed="MoveRight_Executed" />
</Button.CommandBindings>
</Button>
</Canvas>
</Window>
Вот фрагмент кода:
private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e)
{
var uiElement = (UIElement)sender;
double value = Canvas.GetTop(uiElement);
value = Double.IsNaN(value) ? 0 : value;
value++;
Canvas.SetTop(uiElement, value < 0 ? 0 : value);
}
Это все работаетхорошо, но я действительно хочу связку кнопок с этой способностью, а не только эту.Как я могу убедиться, что каждая кнопка имеет эти CommandBindings?Если есть более простой способ, чем использование CommandBindings, что бы это могло быть?
Обновление: По запросу, вот еще один метод, который, похоже, не работает:
<Window x:Class="DiagramDesigner.CanvasControlArrowKeyTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="CanvasControlArrowKeyTest" Height="300" Width="300">
<Window.CommandBindings>
<CommandBinding Command="MoveDown" Executed="MoveDown_Executed" />
<CommandBinding Command="MoveUp" Executed="MoveUp_Executed" />
<CommandBinding Command="MoveLeft" Executed="MoveLeft_Executed" />
<CommandBinding Command="MoveRight" Executed="MoveRight_Executed" />
</Window.CommandBindings>
<Window.InputBindings>
<KeyBinding Key="Down" Command="MoveDown" />
<KeyBinding Key="Up" Command="MoveUp" />
<KeyBinding Key="Right" Command="MoveRight" />
<KeyBinding Key="Left" Command="MoveLeft" />
</Window.InputBindings>
<Canvas >
<Button Width="50" Height="50" />
</Canvas>
</Window>
C #
private void MoveDown_Executed(object sender, ExecutedRoutedEventArgs e)
{
var uiElement = (UIElement)e.OriginalSource; // Still doesn't point to the Button
double value = Canvas.GetTop(uiElement);
value = Double.IsNaN(value) ? 0 : value;
value++;
Canvas.SetTop(uiElement, value < 0 ? 0 : value);
}
Обновление: я отказался от этого подхода.Я решил использовать другое решение для решения проблемы, которое не использует команды.