【问题标题】:WPF cut, copy, paste functionality on a user control用户控件上的 WPF 剪切、复制、粘贴功能
【发布时间】:2013-07-23 15:28:35
【问题描述】:

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

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

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

【问题讨论】:

  • 你在使用 MVVM 模式吗?
  • 我不是,我不知道那是什么。我刚刚开始使用 c# 和 .net。您所说的 MVVM 是指模型视图视图模型吗?
  • @kev3kev3 是的,这就是 MVVM 的含义。

标签: c# wpf user-controls


【解决方案1】:

这可以通过 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)。

【讨论】:

    【解决方案2】:

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

    希望对你有帮助。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-10
        • 2013-05-13
        • 1970-01-01
        相关资源
        最近更新 更多