2011-08-03 67 views
0

我想序列化wpf用戶控件xaml和代碼隱藏。 XamlWriter.Save()只有序列化的XAML,所以我能在這種情況下做什麼?我的情況是我有一個用戶控件,其中包括自定義方法,訂閱事件(例如:按鈕點擊)當我反序列化usercontrol(用於在運行時創建用戶控件)時,我想運行該事件和方法。對不起,我的英語不太好。我如何序列化wpf用戶控件與xaml和後面的代碼

+2

爲什麼要序列化代碼? – gideon

+0

你能解釋一下你爲什麼要這樣做嗎?你不能使用Reflector來獲取C#代碼嗎? –

+1

,因爲我將在運行時創建用戶控件。例如;一個用戶控制的按鈕,當反序列化usercontrol我想運行該事件時,有一個點擊事件(訂閱)。 –

回答

0

只是一個想法,您可以使用MEF爲您的用戶控件構建一個插件結構。你想立即創建一個用戶控件,但事件處理程序仍然應該在你的項目的其他地方硬編碼;通過插件結構,您可以收集插件並重新使用它;事件可以通過命令來處理。也許給一個場景,我們可以弄清楚更多的細節。

另外,ISerializable爲字段提供了自定義二進制序列化的方法,而不是方法或事件。這裏有一個相關的問題: What is the point of the ISerializable interface? ;另一方面,您仍然可以嘗試一些模式,例如Web控件如何保存其視圖狀態;例如 兩個虛擬方法:

public virtual byte[] SaveState(); // it saves the states for your custom control 
public virtual void LoadState(byte[] state) // it restore your state back to the control. 

自定義代碼應該是這樣的:

byte[] state = controlA.SaveState(); // this method saves its own state. 
YourControl controlB = new YourControl(); 
controlB.LoadState(state); // this method load the save state from A to B itself. 

對於事件,每個事件都有一個處理程序的名字,你也可以序列化的處理程序名稱的狀態和通過命名容器中保存的名稱找回它。我沒有任何經驗可以保存該方法。

如果你仍然想保存和加載狀態,包括字段,事件和方法,可能序列化不是你想要的正確方式,我認爲。

+0

UserControl繼承ISerializable接口。我序列化和反序列化usercontrol而不會丟失任何成員,事件,方法。我可以解釋一下,因爲我的英語不太好 –

+0

我更新了我的答案,請檢查它。 – Howard

+0

謝謝你的所有文章 –