Я пытаюсь создать UserControl, который отображает многостраничное изображение и позволяет пользователю увеличивать, поворачивать и просматривать изображение. У одной части, с которой я столкнулся, - это правильно настроить ярлыки клавиатуры. Я понял, что мне нужно иметь установку InputBindings в классе Window, в котором размещается UserControl. Я понял, как создать InputBinding в коде, но я ожидаю много сочетаний клавиш, и я думаю, что их в XAML будет проще. Вот пример проекта, который я проверяю это в:Привязать к UserControl RoutedCommand из родительского окна
MainWindow.xaml
<Window x:Class="CommandTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:CommandTest"
Title="Window1" Height="300" Width="344">
<Window.InputBindings>
<KeyBinding
Key="N"
CommandTarget="x:UCon"
/>
</Window.InputBindings>
<StackPanel>
<local:NestedControl x:Name="UCon">
</local:NestedControl>
</StackPanel>
</Window>
MainWindow.xaml.cs
using System.Windows;
using System.Windows.Input;
namespace CommandTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
KeyGesture keyg = new KeyGesture(Key.OemPlus, ModifierKeys.Control);
KeyBinding kb = new KeyBinding((ICommand)UCon.Resources["Commands.ZoomOut"], keyg);
kb.CommandTarget = UCon;
this.InputBindings.Add(kb);
}
}
}
UserControl1.xaml
<UserControl x:Class="CommandTest.NestedControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<UserControl.Resources>
<!-- UI commands. -->
<RoutedCommand x:Key="Commands.ZoomOut" />
</UserControl.Resources>
<UserControl.CommandBindings>
<CommandBinding x:Name="ZoomCommand" Command="{StaticResource Commands.ZoomOut}" CanExecute="ZoomCommand_CanExecute" Executed="ZoomCommand_Executed"/>
</UserControl.CommandBindings>
<Button Command="{StaticResource Commands.ZoomOut}">Zoom</Button>
</UserControl>
UserControl1.xaml.cs
using System.Windows.Controls;
using System.Windows.Input;
namespace CommandTest
{
public partial class NestedControl : UserControl
{
public NestedControl()
{
InitializeComponent();
}
private void ZoomCommand_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = true;
}
private void ZoomCommand_Executed(object sender, ExecutedRoutedEventArgs e)
{
System.Windows.MessageBox.Show("Zoom", "Zoom");
}
}
}
Создает команду в коде лучше, чем создание команды в XAML? Также это означает, что вы не можете добавить InputBinding на хост UserControl в XAML? Кроме того, это решение не работает. У UserControl1 нет KeyboardFocus, поэтому InputBinding никогда не срабатывает. Если вы нажмете на кнопку, а затем используйте KeyGesture, то MessageBox покажет – Gariig
Независимо от того, используете ли вы код или XAML для создания команд, это действительно зависит от вас - ни «лучше». Я выбрал код здесь, потому что он требует меньше строк, поэтому может быть немного легче понять. Я отредактировал свой ответ, чтобы привязать команду к окну. –