2011-12-21 70 views
1

我正在創建一個WPF自定義控件,並遇到了一種情況。很多代碼在控制初始化之前不會執行:if (this.IsInitialized) { ... }但是,這對我的設計器造成了一個問題,因爲它從不初始化。使用DesignerProperties.GetIsInDesignMode(...)可能出現的問題?

我只是想知道在自定義控件中使用DesignerProperties.GetIsInDesignMode()是否正常使用,如果是這樣,我是否應該警惕任何陷阱?我問這個問題是因爲在自定義控件中設計器特定的檢查/代碼似乎很「髒」。

我想一個好的測量棒將知道微軟是否在他們的任何控制代碼中使用Designer特定的代碼(而不是屬性)?

回答

1

這是這種方法存在的主要原因之一。

儘管我同意在代碼邏輯中使用特定於設計的檢查感覺「髒」,但有時這是最實用的方法。就我個人而言,我覺得在設計模式下使控件很好地工作是自定義控件的必要實現和功能的一部分,在這種情況下,專門處理該情況的代碼不一定是不好的。

很多的代碼不執行,直到控件初始化:

我建議在這個代碼密切關注,但是。在WPF中創建自定義控件時,最好是根據綁定的數據運行代碼,而不是代碼是否已初始化。如果您基於綁定的數據或屬性運行代碼,則無論您是在設計器中執行還是在執行應用程序,都無關緊要。

+0

我使用依賴屬性和只讀依賴項屬性重......這只是我不得不警惕的OnPropertyChanged方法與將IsInitialized檢查,以避免與屬性被設置的順序問題。 ''不同於'。相信我,我從來沒有必要使用IsInitialized,除非在這種情況下,這兩個DP交織在一起並且它們的調用順序在pre-init會導致問題(如果沒有說明的話)。 – 2011-12-21 21:50:15

+0

@ m-y您不能檢查空/無效狀態,而是在那個時候?是什麼導致它在設計時失敗,但在運行時工作? – 2011-12-21 21:53:01

+0

基本上我有一個情況,我有2 DP不能相等。它們是字符值,所以它們不能爲空作爲默認值(而是它們是'+'和' - ')。現在,如果我將它們設置在XAML中,那麼它們有可能暫時等於彼此(拋出異常)pre-init ...但是,如果等到初始化後我可以正確檢查它們的平等性......問題是設計師不初始化控制。我想我只需要使用設計器特定的代碼啊。 – 2011-12-21 23:48:45

0
public MyView() 
     { 
      if (DesignerProperties.GetIsInDesignMode(this))           
       return; 

      InitializeComponent();    
     } 
相關問題