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

C# 用户控件上的WPF剪切、复制、粘贴功能,c#,wpf,user-controls,C#,Wpf,User Controls,我有一个画布,您可以在上面添加用户控件(由图像和文本框组成) 我试图在这些用户控件上实现剪切、复制和粘贴功能,因此上下文菜单附加到一个用户控件上,例如处理图像的用户控件。用户右键单击此处,然后从上下文菜单中选择“复制”,例如,我将如何执行,以便他们可以将其粘贴到画布上 有人能给我指出正确的方向吗…这可以通过RoutedCommand完成。MSDN上有完整概述: 简短的版本是这样的:当命令源(即菜单项)想要执行命令时,会引发一个事件。该事件由最近的命令绑定处理。剪切/复制/粘贴命令已经包含在WPF

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

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


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

这可以通过RoutedCommand完成。MSDN上有完整概述:

简短的版本是这样的:当命令源(即菜单项)想要执行命令时,会引发一个事件。该事件由最近的命令绑定处理。剪切/复制/粘贴命令已经包含在WPF中,某些元素(即文本框)已经包含它们的命令绑定

您可以这样定义菜单项:

<MenuItem Header="Copy" Command="ApplicationCommands.Copy" />
<UserControl.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Copy"
                    Executed="Copy_Executed" />
</UserControl.CommandBindings>

并向UserControl添加命令绑定,如下所示:

<MenuItem Header="Copy" Command="ApplicationCommands.Copy" />
<UserControl.CommandBindings>
    <CommandBinding Command="ApplicationCommands.Copy"
                    Executed="Copy_Executed" />
</UserControl.CommandBindings>

并使用UserControl代码中的签名定义执行的
Copy\u方法

然后当然对
应用程序命令执行相同的操作。在画布中粘贴


由您决定是在自己的应用程序中处理数据,还是使用剪贴板。如果您正在处理图像,WPF有一个可以处理对象的类(如果您有一个
图像
元素,它的
源代码
很可能已经是
位图源代码
)。

首先,设计良好的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


希望有帮助。

如果要从代码绑定命令(as),可以使用:

CommandBindings.Add(new CommandBinding(
    ApplicationCommands.Copy,
    (sender, args) => { /* logic here */ }));

你在使用MVVM模式吗?我不是,那是我不知道那是什么。我刚开始学习c#和.net。你说的MVVM是指模型-视图-模型吗?@kev3kev3是的,这就是MVVM的意思。