2011-01-24 52 views
0

WPF應用程序我繼承包含如下類似的模式XAML的顯著量:找到一個更好的方式來編寫複雜的用戶界面WPF

<Window ...> 
    <Grid> 
     <z:SomeUserControl> 
      <z:AnotherUc> 
       <Label /> <Button /> <ComboBox /> 
      </z:AnotherUc> 
      <z:AnotherUc> 
       <Label /> <Button /> <ComboBox /> 
      </z:AnotherUc> 
     </z:SomeUserControl> 
    </Grid> 
</Window> 

換句話說,我們的UI部分由用戶控件分組,通常嵌套在其他UserControl內。在某些時候,內容是使用基本的WPF內容控件定義的。

我們試圖應對的問題是,在X:名稱屬性不能被應用於任何最內部控制,由於臭名昭著的WPF限制:

Cannot set Name attribute value {0} on element {1}. {1} is under the scope of element {2}, which already had a name registered when it was defined in another scope

這提出了一個問題,因爲代碼隱藏需要能夠引用UserControl中的元素。用戶控件被選中以將用戶界面的一部分分組,因爲所有的默認控件的樣式和模板都是因爲太笨拙和標記很快變成了一個可怕的,難以理解的混亂。

但是,如果微軟無意解決這個所謂的「限制」,那麼必須找到更好的方法。考慮到已使用CS +外部XAML模板文件,請參見GaryGJohnson在連接站點上的解決方法。然而,這有一種sphagetti的感覺,任何中斷綁定的東西都是不行的。

+0

我遇到了類似的問題,我使用了CustomControl項目。但是現在我知道一切都可以使用MVVM和行爲來完成。所以我儘量避免使用x:Name屬性。 – vorrtex 2011-01-24 20:14:17

回答

1

這裏最好的選擇通常是避免在這些「內部」元素上使用代碼。您仍然可以使用數據綁定,因此將它們綁定到DataContext中的屬性將可以正常工作。

當然,另一種選擇是直接將標籤/按鈕/組合框公開爲AnotherUc類的依賴屬性。這將允許您直接將它們用作UserControl的成員,從而避免了範圍問題。

當然,這個缺點是您必須爲特定的元素組合定製用戶控件,而不是允許在其中放置任何控件。

1

聽起來像一團糟的設計。您可以創建自己的AttachedProperty - MyNameProperty,將其設置在您的XAML中,然後編寫您自己的邏輯/視覺樹輔助程序,它可以工作。我並不是說我會那樣做,但是如果你需要一個快速的解決方法(不需要對你的UI組合模型進行根本性的重新設計),那可能會對你有用。

+0

如果你可以發佈一些鬆散的xaml,我可以分享我的想法。上面發佈的那個看起來像是ItemsControl'ing的好候選者 - 即具有通用UI元素的重複項目可以被當作ItemsControl項目來分解。 – 2011-01-24 20:08:29

相關問題