繁体   English   中英

WPF在用户控件上剪切,复制,粘贴功能

[英]WPF cut, copy, paste functionality on a user control

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

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

谁能指出我正确的方向...

这可以通过RoutedCommands完成。 完整的概述位于MSDN: 命令概述

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

您可以定义一个菜单项,如下所示:

<MenuItem Header="Copy" Command="ApplicationCommands.Copy" />

并向用户控件添加命令绑定,如下所示:

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

并在后面的UserControl代码中使用ExecutedRoutedEventHandler签名定义Copy_Executed方法。

然后,当然要对画布中的ApplicationCommands.Paste执行相同的操作。

是否要在自己的应用程序中处理数据还是使用剪贴板取决于您。 如果您正在使用图像,则WPF具有一个Clipboard类,可以与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 */ }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM