我有一个画布,你可以在其上添加UserControls(由图像和文本框组成)
我试图在这些UserControl上实现剪切,复制,粘贴功能,因此上下文菜单被附加到UserControl,例如处理图像。用户右键单击此处,然后从上下文菜单中选择副本,例如,我将如何实施,以便将其粘贴到画布上。
任何人都可以指出我正确的方向......
答案 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 */ }));