2011-06-15 65 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");