使WPF文本框受限制地进行剪切、复制和粘贴

36

我如何使WPF文本框限制剪切、复制和粘贴操作?


我不太了解WPF。你可以使用标签代替(这将不允许你执行剪切/复制/粘贴操作)。 - shahkalpesh
5
但我希望用户通过键盘输入数据。 - Sauron
3个回答

54
剪切、复制和粘贴是任何应用程序中常用的命令。
<TextBox CommandManager.PreviewExecuted="textBox_PreviewExecuted"
         ContextMenu="{x:Null}" />

在上面的文本框代码中,我们可以在CommandManager类的PreviewExecuted事件中限制这些命令。
在代码后面添加下面的代码,你的工作就完成了。
private void textBox_PreviewExecuted(object sender, ExecutedRoutedEventArgs e)
{
     if (e.Command == ApplicationCommands.Copy ||
         e.Command == ApplicationCommands.Cut  || 
         e.Command == ApplicationCommands.Paste)
     {
          e.Handled = true;
     }
}

4
我认为我也需要将上下文菜单设置为null。 - Sauron
如果禁用上下文菜单,那就完美了。 - Prashant Cholachagudda
1
我建议任何人都使用以下形式:e.Command == ApplicationCommands.Cut,而不是进行类型转换,并依赖于可能由于本地化而更改的字符串。我向 Prashant 提交了编辑建议。 - VitalyB
我在我的Windows Phone应用程序8.1中遇到了同样的问题。在Windows Phone应用程序中没有CommandManager..有人可以帮忙吗? - Tasnim Fabiha

19

对于系统采用日语操作系统的情况,commandName方法将无法工作,因为commandName=="Paste"比较将失败。我尝试了下面的方法,并且它对我起作用。此外,我不需要手动禁用上下文菜单。

在XAML文件中:

<PasswordBox.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Paste"
    CanExecute="CommandBinding_CanExecutePaste"></CommandBinding>
</PasswordBox.CommandBindings>

在代码后台:

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

我使用了这段代码,当你按下 Ctr+V 时它运行得很好。但是我注意到,当你右键单击密码框时,这个函数会被调用进入某种无限循环(如果你在这个函数中添加一个 msgbox,你就可以看到)。如何避免这种情况发生? - yem

1
<TextBox.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Cut"
    PreviewExecuted="CommandBinding_PreviewExecutedCut"
    Executed="CommandBinding_ExecutedCut"/>

    <CommandBinding Command="ApplicationCommands.Copy"
    PreviewExecuted="CommandBinding_PreviewExecutedCopy"
    Executed="CommandBinding_ExecutedCopy"/>

    <CommandBinding Command="ApplicationCommands.Paste"
    PreviewExecuted="CommandBinding_PreviewExecutedPaste"
    Executed="CommandBinding_ExecutedPaste"/>
</TextBox.CommandBindings>

在代码后台:
private void CommandBinding_PreviewExecutedCut(object sender, ExecuteRoutedEventArgs e)
{
    e.Handled = true;
}
private void CommandBinding_ExecutedCut(object sender, ExecuteRoutedEventArgs e)
{
}

private void CommandBinding_PreviewExecutedCopy(object sender, ExecuteRoutedEventArgs e)
{
    e.Handled = true;
}
private void CommandBinding_ExecutedCopy(object sender, ExecuteRoutedEventArgs e)
{
}

private void CommandBinding_PreviewExecutedPaste(object sender, ExecuteRoutedEventArgs e)
{
    e.Handled = true;
}
private void CommandBinding_ExecutedPaste(object sender, ExecuteRoutedEventArgs e)
{
}

熊猫给了我一个好主意。有趣的是,除非我也订阅了Executed,否则PreviewExecuted对我来说不会触发。 我喜欢它比熊猫更好,因为没有过多的循环。我喜欢它比Cholachagudda更好,因为他的方法有时会隐藏我的光标。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接