[英]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.