用户控件上的WPF剪切、复制、粘贴功能
本文关键字:复制 功能 剪切 控件 WPF 用户 | 更新日期: 2023-09-27 18:24:22
我有一个画布,您可以在上面添加UserControls(由图像和文本框组成)
我试图在这些UserControls上实现剪切、复制、粘贴功能,因此上下文菜单被附加到处理图像的UserControl上。用户右键单击此处,然后从上下文菜单中选择副本,例如,我将如何实现,以便他们可以将其粘贴到画布上。
有人能给我指正确的方向吗。。。
这可以通过RoutedCommands完成。完整概述见MSDN:命令概述
简短的版本是:当命令源(即菜单项)想要执行命令时,会引发一个事件。该事件由最近的命令绑定处理。剪切/复制/粘贴命令已经包含在WPF中,某些元素(即文本框)已经包含了它们的命令绑定。
您可以定义这样的菜单项:
<MenuItem Header="Copy" Command="ApplicationCommands.Copy" />
并向UserControl添加一个命令绑定,如下所示:
<UserControl.CommandBindings>
<CommandBinding Command="ApplicationCommands.Copy"
Executed="Copy_Executed" />
</UserControl.CommandBindings>
并在UserControl的代码后面定义具有ExecutedRoutedEventHandler签名的Copy_Executed
方法。
当然,对画布中的ApplicationCommands.Paste
执行同样的操作。
这取决于您是想在自己的应用程序中处理数据,还是使用剪贴板。如果您正在处理图像,WPF有一个剪贴板类,它可以处理BitmapSource对象(如果您有一个Image
元素,很可能它的Source
已经是BitmapSource
了)。
首先,设计良好的MVVM应用程序可以简化用户控件的复制/粘贴,因为它将把CLR对象序列化/反序列化到剪贴板。WPF将在反序列化后自行处理用户控件的创建。
如果您的应用程序未实现MVVM。您可以使用XamlWriter/XamlReader将用户控件保存到XAML并自行重新创建。一个例子:
StringBuilder outstr = new StringBuilder();
//this code need for right XML fomating
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
XamlDesignerSerializationManager dsm =
new XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings));
//this string need for turning on expression saving mode
dsm.XamlWriterMode = XamlWriterMode.Expression;
XamlWriter.Save(control, dsm);
//Read control from XAML
var frameObject = XamlReader.Parse(outstr.ToString()) as UserControl;
if (frameObject != null)
stackPanel.Children.Add(frameObject);
有关如何将XAML字符串或序列化流放入剪贴板的部分,可以参考MSDN。
希望能有所帮助。
如果您想从代码中绑定命令(正如@nmclean所解释的),您可以使用:
CommandBindings.Add(new CommandBinding(
ApplicationCommands.Copy,
(sender, args) => { /* logic here */ }));