用户控件上的WPF剪切、复制、粘贴功能

本文关键字:复制 功能 剪切 控件 WPF 用户 | 更新日期: 2023-09-27 18:24:22

我有一个画布,您可以在上面添加UserControls(由图像和文本框组成)

我试图在这些UserControls上实现剪切、复制、粘贴功能,因此上下文菜单被附加到处理图像的UserControl上。用户右键单击此处,然后从上下文菜单中选择副本,例如,我将如何实现,以便他们可以将其粘贴到画布上。

有人能给我指正确的方向吗。。。

用户控件上的WPF剪切、复制、粘贴功能

这可以通过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 */ }));