繁体   English   中英

WPF,ApplicationCommands,RoutedUICommand和CommandBindings

[英]WPF, ApplicationCommands, RoutedUICommand and CommandBindings

嗨,我在WPF上创建一个类似于ApplicationCommand的RoutedUICommand时遇到了麻烦。 理想情况下,我希望有一个与两个不同的UserControl一起使用的“ Duplicate” MenuItem。 MenuItem是否处于活动状态取决于选择哪个UserControl以及UserControl是否包含选定的对象(剪切,复制和过去在不同文本框上的工作方式相同)。

按照这个StackOverflow ,问题我在下面创建了静态类:

namespace App.Classes
{
    public static class myCommands
    {
        private static readonly RoutedUICommand _duplicateCmd = new RoutedUICommand("Duplicate", "Duplicate", typeof(myCommands));

        public static RoutedUICommand Duplicate
        {
            get { return _duplicateCmd; }
        }
    }
}

在主Window的XAML文件中,我添加了对类的名称空间的引用以及对命令的KeyBinding。

<Window x:Class="GUI.App.Views.Windows.wndMain"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:classes="clr-namespace:App.Classes">

<Window.InputBindings>
    <KeyBinding Key="D" Modifiers="Control" Command="{Binding classes:myCommands.Duplicate}" />
</Window.InputBindings>

在MenuItem中,我向“ Duplicate”命令添加了Command绑定

<MenuItem Name="mnCopy" Header="Copy" Command="ApplicationCommands.Copy" InputGestureText="Ctrl+C" />      
<MenuItem Name="mnDuplicate" Header="Duplicate" Command="{Binding classes:myCommands.Duplicate}" InputGestureText="Ctrl+D"/>

最后,在每个用户控件中,我都将CommandBindings添加到了“ Duplicate”和其他ApplicationCommands中。

<UserControl.CommandBindings> 
    <CommandBinding Command="ApplicationCommands.Copy" Executed="CommandBinding_Copy" CanExecute="CommandBindingCanExecute_Copy" />
    <CommandBinding Command="classes:myCommands.Duplicate" Executed="CommandBinding_DuplicateControls" CanExecute="CommandBindingCanExecute_DuplicateControls" />
</UserControl.CommandBindings>

我的Execute和CanExecute每个UserControls的代码背后是

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBinding_Copy(Object sender, ExecutedRoutedEventArgs e)
{
    _viewModel.Copy();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBinding_Duplicate(Object sender, ExecutedRoutedEventArgs e)
{
    _viewModel.Duplicate();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBindingCanExecute_Copy(Object sender, CanExecuteRoutedEventArgs e)
{
    _viewModel.CanExecute_Copy();
}

/// <summary>                                                                                                   
///                                                                                                             
/// </summary>                                                                                                  
public void CommandBindingCanExecute_Duplicate(Object sender, CanExecuteRoutedEventArgs e)
{
    _viewModel.CanExecute_Duplicate();
}

这对我的ApplicationCommands完美地起作用,并且根据选择了哪个UserControl来调用适当的ExecutedCanExecute 但是我无法使其与“ Duplicate” RoutedUICommand一起使用。 有人知道我做错了什么或想念什么吗? 感谢任何人都能提供的帮助。

您通过Path绑定到静态属性,但无法正常工作。 Binding更改为x:Static并应该起作用

<MenuItem Name="mnCopy" Command="ApplicationCommands.Copy" />      
<MenuItem Name="mnDuplicate" Command="{x:Static classes:myCommands.Duplicate}"/>

附带说明RoutedUICommand具有重载的构造函数,该构造函数接受InputGestureCollection ,您可以在其中创建命令时绑定Ctrl + D

private static readonly RoutedUICommand _duplicateCmd = 
    new RoutedUICommand(
           "Duplicate", 
           "Duplicate", 
           typeof(myCommands), 
           new InputGestureCollection(new InputGesture[] { new KeyGesture(Key.D, ModifierKeys.Control) }));

优点是您不必指定InputGestureText ,而不必指定ApplicationCommands.Copy ,并且因为使用了RoutedUICommand ,所以您也不需要指定Header 如果这样做, 默认情况下, RoutedUICommand会同时使用InputGestureTextHeader而您实际上需要针对MenuItem指定的全部是一个Command

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM