【问题标题】:WPF, ApplicationCommands, RoutedUICommand and CommandBindingsWPF、ApplicationCommands、RoutedUICommand 和 CommandBindings
【发布时间】:2014-07-19 04:28:43
【问题描述】:

您好,我在使用 WPF 创建与 ApplicationCommand 类似的 RoutedUICommand 时遇到问题。理想情况下,我希望有一个与两个不同的用户控件一起使用的“重复”菜单项。 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; }
        }
    }
}

在主窗口的 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 中,我添加了一个命令绑定到“复制”命令

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

最后,在我的每个 UserControls 中,我将 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>

每个 UserControls 的 Executed 和 CanExecute 的代码隐藏是

/// <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。但我无法让它与我的“重复”RoutedUICommand 一起使用。有谁知道我做错了什么或错过了什么?任何人都可以提供任何帮助,我们将不胜感激。

【问题讨论】:

    标签: wpf menuitem


    【解决方案1】:

    您正在通过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。如果您这样做 InputGestureTextHeader 将默认取自您的 RoutedUICommand,而您实际上需要针对 MenuItem 指定的只是 Command

    【讨论】:

    • 嗨,dkozl,我按照您的建议将 Binding 更改为 x:static,它运行良好。我还添加了有关 InputGesture 的其他内容,效果也很好。感谢负载和负载。
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2017-06-16
    • 1970-01-01
    • 2019-05-14
    相关资源
    最近更新 更多