我发现自己需要为我在其中一个程序中使用的几个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 :(得分: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的类型,它只能部分工作。