我使用drgevent.Data.GetDataPresent來確定拖動的組件是否可接受。如何處理GetDataPresent讓它接受所有派生類型
我遇到了一個問題,那就是我想接受一個特定的類型,例如SomeType以及從它派生的所有類型。似乎GetDataPresent
不支持這樣的要求。
有什麼想法?
我使用drgevent.Data.GetDataPresent來確定拖動的組件是否可接受。如何處理GetDataPresent讓它接受所有派生類型
我遇到了一個問題,那就是我想接受一個特定的類型,例如SomeType以及從它派生的所有類型。似乎GetDataPresent
不支持這樣的要求。
有什麼想法?
只要不使用GetDataPresent()訪問拖動事件中的數據,這是樣板,但你可以自由地做你的方式。其實檢索對象和檢查,如果你很高興與它的類型:
protected override void OnDragEnter(DragEventArgs drgevent) {
var obj = drgevent.Data.GetData(drgevent.Data.GetFormats()[0]);
if (typeof(Base).IsAssignableFrom(obj.GetType())) {
drgevent.Effect = DragDropEffects.Copy;
}
}
其中base是基類的名稱。雖然GetFormats()的使用看起來很奇怪,但這種方法可以保證工作,因爲拖動一個.NET對象只產生一個格式,即對象類型的顯示名稱。這也是GetDataPresent不能用於派生對象的原因。
我已經回答過類似的問題之前:C# Drag and Drop - e.Data.GetData using a base class
你可以做的是創建其中認爲您拖動數據的容器類。然後在GetDataPresent中檢查容器類的類型,如果它存在,則可以讀取包含數據實際實例的內容成員。
這裏是一個簡單的例子,如果你的基類型是DragDropBaseData,你可以創建下面的DragDropInfo類。
public class DragDropInfo
{
public DragDropBaseData Value { get; private set; }
public DragDropInfo(DragDropBaseData value)
{
this.Value= value;
}
}
然後是拖放可與以下,其中DrafDropDerivedData是DragDropBaseData派生的類來啓動。
DoDragDrop(new DragDropInfo(new DragDropDerivedData()), DragDropEffects.All);
而且你可以用下面的
e.Data.GetData(typeof(DragDropInfo));
謝謝克里斯,很好的答案,但看看漢斯的一個請。 –
@法國男孩漢斯給出了一個很好的答案。它需要更多來自反射基礎設施,而不僅僅是知道所有的派生類型都被封裝在一個名爲DragDropInfo的已知類型中(如我的示例中那樣),但我嚴重懷疑反射會成爲一個問題,因此它是簡潔的答案。 –
太好了,謝謝.. –
謝謝!這個問題涵蓋了我確切的問題,答案是一個完美的解決方案! :) – mbmcavoy