轉(zhuǎn)帖|使用教程|編輯:龔雪|2024-05-11 10:06:54.473|閱讀 122 次
概述:本文將介紹在WPF應(yīng)用中如何使用GongSolutions.WPF.DragDrop實(shí)現(xiàn)列表集合控件的拖動(dòng)處理,希望對(duì)大家有所啟示幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
相關(guān)鏈接:
WPF應(yīng)用中,控件本身也可以通過實(shí)現(xiàn)事件代碼實(shí)現(xiàn)拖動(dòng)的處理,不過如果我們使用GongSolutions.WPF.DragDrop來處理,事情會(huì)變得更加簡(jiǎn)單輕松,它支持很多控件的拖動(dòng)處理,如ListBox, ListView, TreeView, DataGrid等源自ItemsControl的控件,本文介紹在工作流模塊中拖動(dòng)TreeView和DataGrid列表實(shí)現(xiàn)流程順序的調(diào)整處理。
PS:給大家推薦一個(gè)C#開發(fā)可以用到的界面組件——DevExpress WPF,它擁有120+個(gè)控件和庫(kù),將幫助您交付滿足甚至超出企業(yè)需求的高性能業(yè)務(wù)應(yīng)用程序。通過DevExpress WPF能創(chuàng)建有著強(qiáng)大互動(dòng)功能的XAML基礎(chǔ)應(yīng)用程序,這些應(yīng)用程序?qū)W⒂诋?dāng)代客戶的需求和構(gòu)建未來新一代支持觸摸的解決方案。
DevExpress技術(shù)交流群10:532598169 歡迎一起進(jìn)群討論
控件的GitHub地址:
使用GongSolutions.WPF.DragDrop比較簡(jiǎn)單,和其他類似的做法差不多,首先在Nugget找到并添加對(duì)應(yīng)的控件引用,如下所示。
添加完成相關(guān)的引用后,我們?cè)谛枰褂玫腦AML頁(yè)面中添加對(duì)應(yīng)的命名空間,如下代碼上所示。
xmlns:dd="urn:gong-wpf-dragdrop"
主要使用框架依賴屬性:
dd:DragDrop.IsDragSource="True"http://是否作為拖拽源
dd:DragDrop.IsDropTarget="False"http://是否作為投遞目標(biāo)
dd:DragDrop.UseDefaultDragAdorner="True"http://使用默認(rèn)的拖拽裝飾器
dd:DragDrop.UseDefaultEffectDataTemplate="True"http://使用默認(rèn)的陰影數(shù)據(jù)模板
dd:DragDrop.EffectMoveAdornerTemplate//指定移動(dòng)時(shí)的陰影裝飾器模板
dd:DragDrop.DropHandler="{Binding MyDropHandler}"http://投下時(shí)執(zhí)行處理器
不過我們一般使用其中的三項(xiàng)就可以了,如下代碼所示,是基于MVVM的模型綁定:
dd:DragDrop.DropHandler="{Binding ViewModel}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
如下列表的界面,就是設(shè)置了拖動(dòng)的事件處理效果:
拖動(dòng)調(diào)整后,我們直觀的提示一下界面即可,如下所示。
前面我們看到代碼中有 dd:DragDrop.DropHandler="{Binding ViewModel}" ,這個(gè)視圖模型里面就是包含了拖動(dòng)處理的事件的,我們看看它的定義。
首先視圖模型需要實(shí)現(xiàn)接口IDropTarget,以便處理拖動(dòng)后的順序修改邏輯,它的接口定義如下所示。
我們的視圖模型實(shí)現(xiàn)實(shí)現(xiàn)IDropTarget接口,包含了兩個(gè)Over和Drop的方法的實(shí)現(xiàn),如下代碼所示。
主要就是后臺(tái)對(duì)拖動(dòng)的響應(yīng),以便更新后端的記錄順序,我們通過Seq的順序來調(diào)整即可。
上面介紹的是對(duì)于TreeViw控件的處理,對(duì)于DataGrid的處理方法,也是用類似的方式來實(shí)現(xiàn)即可。
其中它的XAML界面代碼如下所示。
<DataGrid
x:Name="grid"
dd:DragDrop.DropHandler="{Binding ViewModel}"
dd:DragDrop.IsDragSource="True"
dd:DragDrop.IsDropTarget="True"
dd:DragDrop.UseDefaultDragAdorner="True"
hc:DataGridAttach.ShowRowNumber="True"
AutoGenerateColumns="False"
HeadersVisibility="All"
IsReadOnly="True"
ItemsSource="{Binding ViewModel.Items}"
MouseDoubleClick="DataGrid_MouseDoubleClick"
RowHeaderWidth="60"
SelectionChanged="DataGrid_SelectionChanged"
SelectionMode="Extended">
同樣我們可以看到的處理方式類似做法,后端頁(yè)面代碼也是實(shí)現(xiàn)拖動(dòng)的順序處理即可,視圖模型實(shí)現(xiàn)實(shí)現(xiàn)IDropTarget接口,如下是視圖模型代碼實(shí)現(xiàn)。
#region 控件拖放處理
void IDropTarget.DragOver(IDropInfo dropInfo)
{
var sourceItem = dropInfo.Data as FormFlowInfo;
var targetItem = dropInfo.TargetItem as FormFlowInfo;
if (sourceItem != null && targetItem != null)// && targetItem.CanAcceptChildren)
{
dropInfo.DropTargetAdorner = DropTargetAdorners.Highlight;
dropInfo.Effects = DragDropEffects.Copy;
}
}
async void IDropTarget.Drop(IDropInfo dropInfo)
{
var sourceItem = (FormFlowInfo)dropInfo.Data;
var targetItem = (FormFlowInfo)dropInfo.TargetItem;
string dragMenuId = sourceItem.Id;
string dropMenuId = targetItem.Id;
try
{
if (!dragMenuId.IsNullOrEmpty() && !dropMenuId.IsNullOrEmpty())
{
await BLLFactory<IFormFlowService>.Instance.UpdateTwoSeq(dragMenuId, dropMenuId);
await GetData();
GrowlUtil.ShowInfo("已調(diào)整了步驟順序");
}
}
catch (Exception ex)
{
LogTextHelper.Error(ex);
GrowlUtil.ShowError(ex.Message);
}
}
#endregion
以上就是在WPF應(yīng)用中使用GongSolutions.WPF.DragDrop實(shí)現(xiàn)列表集合控件的拖動(dòng)處理,它在其他各類型列表集合控件中使用都是類似的方式,因此比較好用,而且實(shí)現(xiàn)的效果也比較不錯(cuò),強(qiáng)烈推薦。
本文轉(zhuǎn)載自:
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: