Пользовательская команда в WPF, позволяющая изменять значение свойства зависимости в режиме реального времени - PullRequest
0 голосов
/ 18 мая 2010

У меня есть сценарий, в котором в моем пользовательском элементе управления есть пользовательское свойство зависимости, называемое MinValue типа int.

Я хочу разрешить пользователю изменять это значение с помощью клавиш ввода Ctrl ++ (увеличение) и Ctrl + - (уменьшение). Я согласен, что это можно сделать с помощью команд, но я не знаю, где реализовать эти команды. Пользователь должен иметь возможность использовать вышеупомянутые сочетания клавиш независимо от того, какой элемент управления в окне имеет фокус.

Я думаю, что мне нужно было бы реализовать Команду в моем пользовательском элементе управления, потому что только этот элемент управления знает, что делать с сочетанием клавиш, но, поскольку у меня есть список, полный настраиваемых элементов управления, и каждый из них должен обрабатывать это сочетание не уверен, как это будет работать. Есть указатели? Спасибо как всегда!

1 Ответ

0 голосов
/ 10 ноября 2013

Есть другие способы сделать это и, вероятно, веские причины не делать это таким образом, но вот реализация, которая помещает команды в пользовательский элемент управления:

Код пользовательского контроля (может быть также простым элементом управления):

public partial class TestControl : UserControl
    {
        //Declare routed commands
        public static RoutedCommand IncrementCommand;
        public static RoutedCommand DecrementCommand;

        static TestControl()
        {
            //Create routed commands and add key gestures.
            IncrementCommand = new RoutedCommand();
            DecrementCommand = new RoutedCommand();
            IncrementCommand.InputGestures.Add(new KeyGesture(Key.Add, ModifierKeys.Control));
            DecrementCommand.InputGestures.Add(new KeyGesture(Key.Subtract, ModifierKeys.Control));
        }

        public TestControl()
        {
            //Subscribe to Increment/Decrement events.
            TestControl.Decremented += down;
            TestControl.Incremented += up;

            InitializeComponent();
        }

        //Declare *static* Increment/Decrement events.
        public static event EventHandler Incremented;
        public static event EventHandler Decremented;

        //Raises Increment event
        public static void IncrementMin(object o, ExecutedRoutedEventArgs args)
        {
            if (Incremented != null)
            {
                Incremented(o, args);
            }
        }

        //Raises Decrement event
        public static void DecrementMin(object o, ExecutedRoutedEventArgs args)
        {
            if (Decremented != null)
            {
                Decremented(o, args);
            }
        }

        //Handler for static increment
        private void down(object o, EventArgs args)
        {
            Min--;
        }

        //Handler for static decrement
        private void up(object o, EventArgs args)
        {
            Min++;
        }

        //Backing property
        public int Min
        {
            get { return (int)GetValue(MinProperty); }
            set { SetValue(MinProperty, value); }
        }

        public static readonly DependencyProperty MinProperty =
            DependencyProperty.Register("Min", typeof(int),
            typeof(TestControl), new UIPropertyMetadata(0));
    }

В окнах, в которых требуется такое поведение, необходимо добавить CommandBinding для этих команд. Код окна позади:

public MainWindow()
{
    InitializeComponent();

    //Raise control's static events in response to routed commands
    this.CommandBindings.Add(
        new CommandBinding(TestControl.IncrementCommand, new ExecutedRoutedEventHandler(TestControl.IncrementMin)));
    this.CommandBindings.Add(
        new CommandBinding(TestControl.DecrementCommand, new ExecutedRoutedEventHandler(TestControl.DecrementMin)));            
}

Это помогает?

(О, кстати, как написано, этот код реагирует только на клавиши +/- на моей клавиатуре, а не над клавишами (P) ([) (]) - я раньше не работал с клавишами Конечно, это не может быть очень нужно исправить.)

...