WPF控制項深拷貝 序列化 反序列化

2021-09-07 18:31:00 字數 1388 閱讀 7830

原文:

wpf控制項深拷貝:序列化/反序列化

今天debuglzq在做wpf拖動總結的時候,遇到了這個問題。baidu了下,貌似沒有解決這個問題的權威答案,遂寫下這篇博文。

我想做的事情是:拖動乙個窗體內的控制項(rectangle)到另乙個容器控制項內,而保留原來的控制項。

為了更好地把問題說清楚,請看如下**片段:

void canvas1_drop(object

sender, drageventargs e)

}

最後一行**報告這樣的執行時異常:

specified element is already the logical child of another element. disconnect it first

這是控制項拷貝的問題。為了解決這個問題,我們可以這樣:

void canvas1_drop(object

sender, drageventargs e)

}

以上**,是能消除這個異常,但是,被拖動的控制項也沒了。如果需求是不保留原來這個rectangle,問題也就解決了,debuglzq也沒有必要寫這篇博文分享給各位。

既然控制項直接拿過來行不通,那麼這麼解決呢?

容易想到的方法是複製這個控制項。但是如你所見,上面的複製方法明顯行不通,屬於引用物件的拷貝,只拷貝了乙個指標,其實是同乙個物件。

深拷貝,好了:

傻x一點辦法如下:

if (data.getdatapresent(typeof

(rectangle)))

問題是解決了,但這種**明顯醜陋!不堪入目~雖然是效果上實現了,但總感覺其中**影藏著乙個定時炸彈,debuglzq惶惶不可終日;再退一步講,即使這樣沒有問題,但是1個rectangle就得如此大費周章,要是來個for迴圈怎麼辦?!

因此這種解決方法絕非可接受!

英文就是好,本來中文囉嗦一大堆的東西,一句話就寫完了!

我們可以(深)拷貝這個控制項採用序列化/反序列化的方式!實現如下:

if (data.getdatapresent(typeof

(rectangle)))

希望對你有幫助~

很久沒有把博文發到首頁了,這篇發一下吧,老鳥飛過,輕拍~

這篇博文說白了,就是序列化/反序列化。更一般的方法,請參考debuglzq的博文:總結.net中的:賦值vs淺拷貝vs深拷貝[序列化/反序列化]

tips:今天在codeproject上看到一篇類似的文章,xaml serialization

覺得寫得沒有我的好,

大家也可以看下~

沒什麼高階的東西,老鳥繞過,輕拍~

WPF控制項深拷貝 序列化 反序列化

今天debuglzq在做wpf拖動總結的時候,遇到了這個問題。baidu了下,貌似沒有解決這個問題的權威答案,遂寫下這篇博文。我想做的事情是 拖動乙個窗體內的控制項 rectangle 到另乙個容器控制項內,而保留原來的控制項。為了更好地把問題說清楚,請看如下 片段 void canvas1 dro...

WPF控制項深拷貝 序列化 反序列化

原文 wpf控制項深拷貝 序列化 反序列化 今天debuglzq在做wpf拖動總結的時候,遇到了這個問題。baidu了下,貌似沒有解決這個問題的權威答案,遂寫下這篇博文。我想做的事情是 拖動乙個窗體內的控制項 rectangle 到另乙個容器控制項內,而保留原來的控制項。為了更好地把問題說清楚,請看...

WPF控制項深拷貝 序列化 反序列化

今天debuglzq在做wpf拖動總結的時候,遇到了這個問題。baidu了下,貌似沒有解決這個問題的權威答案,遂寫下這篇博文。我想做的事情是 拖動乙個窗體內的控制項 rectangle 到另乙個容器控制項內,而保留原來的控制項。為了更好地把問題說清楚,請看如下 片段 void canvas1 dro...