首页 > 编程语言 >解决WPF的TextBox的复制、剪切功能被其他应用程序妨碍的问题

解决WPF的TextBox的复制、剪切功能被其他应用程序妨碍的问题

时间:2022-12-31 23:12:39浏览次数:39  
标签:sender Text void 应用程序 result WPF TextBox textBox

在一些应用程序运行时,它会使WPF的TextBox的复制、剪切功能发生错误,我遇到的情况是会卡顿并且无法成功执行。听说这个问题是由多个应用程序同时访问剪切板导致的。我解决了这个问题,现在分享我的解决方法。

因为使用 Clipboard.SetDataObject() 能避免这个问题,因此只要把TextBox自带的复制、剪切功能关闭,再用代码来实现就可以解决。

关闭TextBox自带的复制、剪切功能的代码,在XAML文件中:

<TextBox PreviewKeyDown="keyFunctionForCommonTextBox">
<TextBox.CommandBindings>
 <!--关闭自带的复制功能-->
<CommandBinding Command="ApplicationCommands.Copy" CanExecute="CommandBinding_CanExecute" />
<!--关闭自带的剪切功能-->
<CommandBinding Command="ApplicationCommands.Cut" CanExecute="CommandBinding_CanExecute" />
</TextBox.CommandBindings>
</TextBox>

相关的C#代码:

//使用快捷键来实现复制或剪切。
private void keyFunctionForCommonTextBox(object sender, KeyEventArgs e)
{
if ((e.KeyboardDevice.IsKeyDown(Key.LeftCtrl) || e.KeyboardDevice.IsKeyDown(Key.RightCtrl)))
{
if (e.Key == Key.C)
{
((TextBox)sender).copySelectText();
return;
}
else if (e.Key == Key.X)
{
((TextBox)sender).cutSelectText();
return;
}
}
}

//关闭自带的功能。
private void CommandBinding_CanExecute(object sender, CanExecuteRoutedEventArgs e)
{
e.CanExecute = false;
e.Handled = true;
}

实现鼠标右键菜单的复制、剪切、粘贴功能的代码,在XAML文件中:

<TextBox PreviewKeyDown="keyFunctionForCommonTextBox">
<TextBox.ContextMenu>
<ContextMenu>
<MenuItem Header="复制" Click="textBoxCopyContent" />
<MenuItem Header="剪切" Click="textBoxCutContent" />
<MenuItem Header="粘贴" Click="textBoxPasteContent" />
</ContextMenu>
</TextBox.ContextMenu>

相关的C#代码:

private void textBoxCopyContent(object sender, RoutedEventArgs e)
{
MenuItem _menuItem = (MenuItem)sender;
ContextMenu _contextMenu = (ContextMenu)_menuItem.Parent;
TextBox _textBox = (TextBox)_contextMenu.PlacementTarget;
_textBox.copySelectText();
}

private void textBoxCutContent(object sender, RoutedEventArgs e)
{
MenuItem _menuItem = (MenuItem)sender;
ContextMenu _contextMenu = (ContextMenu)_menuItem.Parent;
TextBox _textBox = (TextBox)_contextMenu.PlacementTarget;
_textBox.cutSelectText();
}

private void textBoxPasteContent(object sender, RoutedEventArgs e)
{
MenuItem _menuItem = (MenuItem)sender;
ContextMenu _contextMenu = (ContextMenu)_menuItem.Parent;
TextBox _textBox = (TextBox)_contextMenu.PlacementTarget;
_textBox.paste();
}

 为TextBox添加扩展方法,需要放在一个静态类中:

public static class extendWPF
{

public static void copySelectText(this TextBox p_textBox)
{
if (p_textBox.SelectedText.Length < 1)
{
return;
}
Clipboard.SetDataObject(p_textBox.SelectedText);
}

public static void cutSelectText(this TextBox p_textBox)
{
if (p_textBox.SelectedText.Length < 1)
{
return;
}
Clipboard.SetDataObject(p_textBox.SelectedText);
int _position = p_textBox.SelectionStart;
string _text = p_textBox.Text.Substring(0, _position);
_text = _text + p_textBox.Text.Substring(_position + p_textBox.SelectionLength);
p_textBox.Text = _text;
p_textBox.Select(_position, 0);
}

public static void paste(this TextBox p_textBox)
{
int _position = p_textBox.CaretIndex;
if (p_textBox.SelectionLength < 1)
{
string _result = p_textBox.Text.Substring(0, p_textBox.CaretIndex);
_result = _result + Clipboard.GetText();
int _length = Clipboard.GetText().Length;
_result = _result + p_textBox.Text.Substring(p_textBox.CaretIndex);
p_textBox.Text = _result;
p_textBox.CaretIndex = _position + _length;
}
else
{
string _result = p_textBox.Text.Substring(0, p_textBox.SelectionStart);
_result = _result + Clipboard.GetText();
int _length = Clipboard.GetText().Length;
_result = _result + p_textBox.Text.Substring(p_textBox.SelectionStart+p_textBox.SelectionLength);
p_textBox.Text = _result;
p_textBox.CaretIndex = _position + _length;
}
}

}

标签:sender,Text,void,应用程序,result,WPF,TextBox,textBox
From: https://www.cnblogs.com/breezeEmbrace/p/17017534.html

相关文章

  • WPF 自定义附加事件
    我们都知道路由事件,而附加路由事件用的比较少。但如果是通用的场景,类似附加属性,附加事件就很有必要的。举个例子,输有这么多输入事件Mouse、Touch、Stylus,另外按钮Click还处......
  • 使用MicroK8s部署第一个应用程序
    Kubernetes具有挑战性。对此,没有任何争议。不仅在将容器部署到Kubernetes集群中有很多移动部件,而且在这一过程中可能会出现很多问题。更为复杂的是,部署Kubernetes集群可能是......
  • 基于WPF实现简单放大镜效果
    原文网址:https://www.jb51.net/article/271074.htmWPF如何实现简单放大镜框架使用.NET40;VisualStudio2019;实现此功能需要用到 VisualBrush ,放大镜展现使用 Can......
  • wpf后台设置image
    img_backpic.Source=newBitmapImage(newUri(path,UriKind.RelativeOrAbsolute));UriKind有3种类型:RelativeOrAbsolute/Absolute/Relative,这里测试用了RelativeOrAbs......
  • WPF中使用EventHandler更新UI内容
    在WPF中,EventHandler类似于一套订阅与发布的操作。甲方提供一个event的回调注册入口让乙方来订阅自己发布的event。这么理解起来就是需要发布消息的一方定义event(就像是C语......
  • 应用程序和桌面交付丨Parallels RAS功能简介
    简单、安全的混合远程办公解决方案,让用户能够通过任何设备或操作系统,远程访问应用程序和桌面。 1、创建理想的数字工作区,将您的应用和桌面从本地服务器集中到云......
  • WPF中使用委托机制更新UI内容
    在开发WPF应用程序时,UI线程不做高负载的工作,需要交给其他工作者线程去干。当工作者线程干完活得到一个结果后需要发送给UI线程进行展示,那最好的方法就是使用委托机制了。如......
  • python的web应用程序开发(Django框架)
    python的web应用程序开发(Django框架)1.安装Django并开启网页服务器pipinstalldjango#安装Django包django-adminstartprojectmysite#在指定路径下新建一个mysite文件......
  • WPF使用WebView2的空域问题(Airspace issuse)
    WebView2forwpf控件非常好用,然而,由于它是用的HwndHost的方式嵌入到WPF程序中的,和传统的使用HwndHost嵌入WinForm组件的方式一样,它有着WPF由来已久的空域问题(Airspaceis......
  • WPF 绑定
    privatevoidWindow_Loaded(objectsender,RoutedEventArgse){Bindingbinging=newBinding();binding.Source=this.slider1;binding.Path=newProperty......