2011-09-22 17 views
2

我正在製作一個自定義控件,它有兩種非常不同的樣式需求。一個用於基本外觀,另一個用於更高級的外觀。兩種風格之間的自定義控件切換

我的控件包含一個依賴屬性爲以下枚舉:

public enum ControlTypes 
{ 
    Basic, 
    Advanced 
} 

我創建了兩種風格在generic.xaml(具有非常不同的模板),並給每一個關鍵。

在枚舉屬性的更改處理程序內我試圖找到樣式並設置正確的。

private static void OnControlTypePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
    var myCustomControl = (MyCustomControl)d; 

    var basicControlStyle = Application.Current.TryFindResource("BasicControlStyle") as Style; 
    var advancedControlStyle = Application.Current.TryFindResource("AdvancedControlStyle") as Style; 

    if (myCustomControl.ControlType == ControlTypes.Basic) 
     myCustomControl.Style = basicControlStyle; 
    else if (myCustomControl.ControlType == ControlTypes.Advanced) 
     myCustomControl.Style = advancedControlStyle;    
} 

這兩種樣式總是空的。我不確定如何從generic.xaml中獲取樣式。還是有更好的方式來交換我的風格?

+0

如何簡單地將每個容器的Visible屬性綁定到枚舉的當前值? – kenny

+0

控件有幾個必需的部分,兩個模板都是相同的(儘管模板完全不同)。我目前在ApplyTemplate覆蓋內找到模板部分。如果我給每個部件一個唯一的名稱,並且在控件類型更改時重新獲取它們(使用每個部件的第二個名稱),那麼您的建議將起作用。這個古怪的設計將很好地避免。 – mbursill

+0

在這種情況下,您可以將Visibility屬性綁定到控件中的「IsAdvancedStyle」屬性(而不是通過控件中的名稱引用所有內容) - 但這不是最佳解決方案。 Application.Current.TryFindResource的結果是否返回null?它是否返回一個非'樣式'實例?不要忘記資源名稱區分大小寫。 'generic.xaml'是否已正確添加到主應用程序資源集合中? – fatty

回答

1

刪除OnControlTypePropertyChanged中的代碼,並在您的XAML中放置類似的內容。請注意,我已經綁定到一個名爲IsAdvanced屬性,因爲它是爲測試簡單,但可以綁定到通過改變「真」的一個枚舉{X:靜態命名空間:nameofyourenum.Value}

<Style TargetType="local:SomeControl"> 
    <Style.Setters> 
     <Setter Property="Control.Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="local:SomeControl"> 
        <StackPanel> 
         <TextBlock Text="DefaultTemplate"></TextBlock> 
        </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style.Setters> 
    <Style.Triggers> 
     <Trigger Property="IsAdvanced" Value="True"> 
      <Trigger.Setters> 
       <Setter Property="Control.Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="local:SomeControl"> 
          <TextBlock Text="Advanced Template"></TextBlock> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
      </Trigger.Setters> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

注意,這仍然讓使用控件的程序員能夠完全覆蓋控件模板並做他們想做的事情。你的原始方法不允許這樣做。