2009-11-04 49 views
0

我目前正在創建一些測試控件。在WPF中一切都很好,我可以繼承例如邊框或滾動查看器。在Silverlight中,這是不可能的,所以我必須做一個小動作(多目標)...從Silverlight派生的最佳未密封UI元素

我從StackPanel派生我的測試元素,並添加內容作爲孩子。當然,我也可以從WrapPanel,Canvas派生出來。我的問題是,當使用這種方法時,Silverlight中的哪個UI元素(不是密封的)是最佳使用方式。它應儘可能少地干擾測試元素。或者我必須在元素之間進行細分(例如寬度設置)。

讓我舉一個更好的例子。如果我想要一個簡單的TextBlock,它總是說「你好」,並有一個紅色的背景。在WPF中,我繼承了TextBlock。這在Silverlight中是不可能的。在那裏,我會例如這樣做:

public class RedTextBlock : StackPanel 
{ 
    public TextBlock WrappedBlock {get; private set;} 
    public RedTextBlock() 
    { 
     WrappedBlock = new TextBlock 
     { 
      Text = "Hello", 
      Background = new SolidColorBrush(Colors.Red) 
     }; 

     Children.Add(WrappedBlock); 
    } 
} 

我不是很喜歡這個解決方案,但還沒找到更好的解決方案。但在這種情況下,我不確定StackPanel是否不適合我的示例。因爲我認爲它可能會影響佈局(例如儘可能多地佔用空間)與直接文本塊實例相反。

在其他情況下,包含控件可能是一個ScrollViewer,一個圖像,無論..所有控件,我不能「正確」,因爲它們是密封的子類。

這種方法是否可行,哪種控制方式最適合在這種通用情況下進行子類化處理,還是有更好的想法? (我不想去「界面 - 查看屬性」的方式,我真的想繼承現有UI元素)如果你想堆東西..

克里斯

回答

0

,那麼StackPanel的罰款。如果你只有一個孩子,那麼你最好的選擇是use ContentControl並將TextBlock設置爲內容。如果你有很多孩子,你可以使用Panel,但如果你走這條路線,你必須手動佈置所有的孩子。但是對於你所描述的內容,我認爲內容控制是最好的。

0

讓我舉個更好的例子。如果我想要一個簡單的TextBlock,它總是說「你好」,並有一個紅色的背景。在WPF中,我繼承了TextBlock。

而不是繼承,你有沒有考慮過使用樣式?它更適合這種情況。

+0

是的,我正在使用他們的一些東西,但大多數時候我需要更復雜的東西。只是最簡單的例子,但感謝提示.. – 2009-11-04 19:29:58

0

答案是直接停止使用WPF和Silverlight,因爲它們在API級別上不兼容,並且在將代碼從一個代碼移植到另一個時總會遇到問題。如果您想保留您在WPF和Silverlight上的投資並維護一個代碼庫,則可以使用NOV。你的情況下,自定義文本控件將是這樣的:

public class MyTextBox : NTextBox 
{ 
    public MyTextBox() 
    { 
     base.Text = "Hello"; 
    } 
} 

並沒有更多的問題 - 該文本框將在WPF,Silverlight中,WindowsForms和的MonoMac/XamarinMac工作。

相關問題