【问题标题】:WPF: How to redefine CanExecute method of ApplicationCommandsWPF:如何重新定义 ApplicationCommands 的 CanExecute 方法
【发布时间】:2010-03-27 18:43:52
【问题描述】:

我使用标准的剪切、复制和粘贴命令(这是 ApplicationCommands 类的一部分)。是否可以重新定义 CanExecute 方法?

这是我的代码:

XAML:

   <Window.CommandBindings>
        <CommandBinding Command="Copy"
                CanExecute="CopyCanExecute" Executed="CopyExecuted"/>       
    </Window.CommandBindings>

    <StackPanel>
        <TextBox Name="txt"></TextBox>
        <Button Command="Copy" CommandTarget="{Binding ElementName=txt}">copy</Button>
    </StackPanel>

代码隐藏:

private void CopyCanExecute(object sender, CanExecuteRoutedEventArgs e)
{
    e.CanExecute = false;
}

private void CopyExecuted(object sender, ExecutedRoutedEventArgs e)
{
    MessageBox.Show("Copy Executed");
}  

按钮的行为仍然像它的命令是标准的复制命令。

【问题讨论】:

    标签: c# wpf command


    【解决方案1】:

    您可以通过CommandBinding 执行此操作。本地 CommandBinding 可以指定 CanExecuteHandler。

    有关详细信息和工作示例,请参阅this blog post

    【讨论】:

    • 无法理解为什么它不能与 Copy\Cut\Paste 一起使用(使用 Help 命令的示例可以正常工作)。我将 CommandBinding 添加到 Copy 并定义 CanExecute 以返回 false:e.CanExecute = false 在代码隐藏文件中。但是复制仍然像标准复制命令一样工作:当我在 TextBox 中选择一个文本时,按钮就会启用。你能帮我理解这个问题吗?
    【解决方案2】:

    当焦点位于已处理命令的文本框上时,复制命令将不起作用,但它适用于 CheckBox 等元素。

    【讨论】:

      【解决方案3】:

      在 CanExecute 处理程序中,您可能需要添加 `e.Handled = true;另外,这样它就不会去执行标准的 Copy.CanExecute()

      【讨论】:

      • e.Handled = true 对此没有影响。我还更改了 e.CanExecute = true,但是单击按钮只是复制了选定的文本并且我的 MessageBox 没有出现
      【解决方案4】:

      您可以直接将命令绑定设置为文本框而不是窗口。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-07-12
        • 2011-01-27
        • 2014-07-19
        • 2010-12-17
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        • 1970-01-01
        相关资源
        最近更新 更多