内容未在代码中的切换按钮样式和模板上显示

时间:2011-06-15 21:39:15

标签: c# wpf styles code-behind 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";

3 个答案:

答案 0 :(得分:4)

我没有看到您分配VisualTree m_ToggleTemplate的行。你有这一行:

m_LocationSelectionTemplate.VisualTree = g;

但是ToggleTemplate访问者中没有任何地方确实为m_ToggleTemplate设置了有效值。

需要注意的是使用FrameworkElementFactory。根据{{​​3}},这不是创建控件模板的最佳方式,实际上已弃用:

  

这个类是一种不常用的方式,以编程方式创建模板,模板是FrameworkTemplate的子类,如ControlTemplate或DataTemplate; 使用此类创建模板时,并非所有模板功能都可用。以编程方式创建模板的推荐方法是使用XamlReader类的Load方法从字符串或内存流加载XAML。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

发现问题:

m_ToggleTemplate = new ControlTemplate();

应该是:

m_ToggleTemplate = new ControlTemplate(typeof(ToggleButton));

显然,如果你没有设置ControlTemplate的类型,它只能部分工作。