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

时间:2013-07-23 15:28:36

标签: c# wpf user-controls

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

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

任何人都可以指出我正确的方向......

3 个答案:

答案 0 :(得分:4)

这可以通过RoutedCommands完成。完整概述位于MSDN:Commanding Overview

短版本是这样的:当命令源(即菜单项)想要执行命令时,会引发一个事件。该事件由最近的命令绑定处理。剪切/复制/粘贴命令已包含在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有一个Clipboard类可以使用BitmapSource个对象(如果你有一个Image元素,那么它的Source可能已经是BitmapSource)。

答案 1 :(得分:0)

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

希望它可以提供帮助。

答案 2 :(得分:0)

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

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