2011-06-15 55 views
1

我發現自己需要定義一些樣式和模板,用於我在我的程序中使用的幾個ToggleButton元素。我有一切工作,除了我設定的內容不顯示。我對如何讓內容正確顯示感到不知所措。我的代碼如下:內容不顯示在ToggleButton樣式和模板代碼

private Style m_ToggleStyle; 
    private Style ToggleStyle 
    { 
     get 
     { 
      if (m_ToggleStyle == null) 
      { 
       lock (new object()) 
       { 
        if (m_ToggleStyle == null) 
        { 
         m_ToggleStyle = new Style(typeof(ToggleButton)); 

         m_ToggleStyle.Setters.Add(new Setter { Property = ToggleButton.TemplateProperty, Value = ToggleTemplate }); 
        } 
       } 
      } 
      return m_ToggleStyle; 
     } 
    } 

    private ControlTemplate m_ToggleTemplate; 
    private ControlTemplate ToggleTemplate 
    { 
     get 
     { 
      if (m_ToggleTemplate == null) 
      { 
       lock (new object()) 
       { 
        if (m_ToggleTemplate == null) 
        { 
         m_ToggleTemplate = new ControlTemplate(); 
         FrameworkElementFactory g = new FrameworkElementFactory(typeof(Grid)); 
         g.SetValue(Grid.MarginProperty, new Thickness(0)); 
         g.Name = "MainGrid"; 

         FrameworkElementFactory cp = new FrameworkElementFactory(typeof(ContentPresenter)); 
         cp.SetValue(ContentPresenter.NameProperty, "Contents"); 
         cp.SetValue(ContentPresenter.HorizontalAlignmentProperty, System.Windows.HorizontalAlignment.Stretch); 
         cp.SetValue(ContentPresenter.VerticalAlignmentProperty, System.Windows.VerticalAlignment.Stretch); 
         cp.SetValue(ContentPresenter.MarginProperty, new Thickness(2)); 
         cp.Name = "Contents"; 

         g.AppendChild(cp); 
         m_ToggleTemplate.VisualTree = g; 

         ImageBrush ibBackgroundUnselected = new ImageBrush(); 
         ibBackgroundUnselected.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Controls;component/Resources/TabUnselected.png", UriKind.Absolute)); 
         g.SetValue(Grid.BackgroundProperty, ibBackgroundUnselected); 

         ImageBrush ibBackgroundSelected = new ImageBrush(); 
         ibBackgroundSelected.ImageSource = new BitmapImage(new Uri("pack://application:,,,/Controls;component/Resources/TabSelected.png", UriKind.Absolute)); 

         Trigger tIsChecked = new Trigger { Property = ToggleButton.IsCheckedProperty, Value = true }; 
         tIsChecked.Setters.Add(new Setter(Grid.BackgroundProperty, ibBackgroundSelected, "MainGrid")); 

         m_ToggleTemplate.Triggers.Add(tIsChecked); 

        } 
       } 
      } 
      return m_ToggleTemplate; 
     } 
    } 

這是作爲我動態創建喜歡的ToggleButtons:

ToggleButton tbExample = new ToggleButton(); 
tbExample.Style = ToggleStyle; 
tbExample.Content = "Content"; 
+0

我也很好奇你爲什麼鎖定在你的兩個屬性訪問器中的新對象。那完成了什麼? – Charlie 2011-06-15 23:12:02

+0

對不起,我對我的代碼進行了清理,從中刪除了一些可識別的內容,這是對它的快速修復。從我所瞭解的實際工作中,但我從來沒有在實踐中嘗試過,因爲擔心它不會。 – 2011-06-16 14:43:19

回答

0

發現了問題:

m_ToggleTemplate = new ControlTemplate(); 

本來應該是:

m_ToggleTemplate = new ControlTemplate(typeof(ToggleButton)); 

很顯然,如果你沒有設置控件模板的類型,它只是部分有效。

4

我沒有看到行,你分配的m_ToggleTemplateVisualTree。你有這樣一行:

m_LocationSelectionTemplate.VisualTree = g;

但無處在ToggleTemplate訪問你實際上是m_ToggleTemplate設置有效的值。

還有一點要注意的是你使用FrameworkElementFactory。根據MSDN,這不是創建控件模板的最佳方式,實際上是在棄用:

這個類是過時的以編程方式創建模板,這是FrameworkTemplate的子類,如控件模板或DataTemplate中; 當您使用此類創建模板時,並非所有模板功能都可用。以編程方式創建模板的推薦方法是使用XamlReader類的Load方法從字符串或內存流中加載XAML。

+0

對不起,是的,我錯過了清理我的一個變量名,這就是線。使用這種方法給了我更多的靈活性,而不是在推出XAML之前進行字符串操作,我希望能夠完成代碼的所有工作。 – 2011-06-16 14:46:38

0
FrameworkElementFactory cp = new FrameworkElementFactory(typeof(ContentPresenter)); 
cp.SetValue(ContentPresenter.NameProperty, "Contents"); 

// try adding this line 
cp.SetValue(ContentPresenter.ContentSourceProperty, "Content");