如何在代码中设置控制模板?
我在XAML中有这个
我想在C#代码中实现相同的function。 我怎样才能做到这一点?
ControlTemplate ct = new ControlTemplate();.. Image img = new Image();..
现在如何将此图像分配给控制模板? 我们能做到这一点还是我错过了这里的任何概念?
在代码隐藏中创建模板不是一个好主意,理论上可以通过定义ControlTemplate.VisualTree
( FrameworkElementFactory
。
ControlTemplate template = new ControlTemplate(typeof(Button)); var image = new FrameworkElementFactory(typeof(Image)); template.VisualTree = image;
由于您需要使用SetValue
和SetBinding
分配属性非常迂回:
image.SetValue(Image.SourceProperty, ...);
此外,关于(以前)接受的答案和引用的东西:
以编程方式设置ControlTemplate就像使用XAML一样,因为我们必须使用XamlReader类。
那句话是错的,我们不“必须” 。
如果我在运行时分配模板,我将它们定义为一个资源,如果我需要它我可以加载。
编辑:根据文档FrameworkElementFactory
不推荐使用:
此类是以编程方式创建模板的不推荐使用的方式,模板是FrameworkTemplate的子类,如ControlTemplate或DataTemplate; 使用此类创建模板时,并非所有模板function都可用。 以编程方式创建模板的推荐方法是使用XamlReader类的Load方法从字符串或内存流加载XAML。
我想知道这个建议是不是一个好主意。 我个人仍然会将模板定义为XAML中的资源,如果我可以避免使用字符串和XamlReader
。
以编程方式设置ControlTemplate就像使用XAML一样,因为我们必须使用XamlReader类。 例如,下面是设置按钮模板的代码,假设我们要在加载后设置按钮的模板。
private void Button_Loaded(object sender, RoutedEventArgs e) { var button = sender as Button; string template = "" + "" + " " + " " + " "; button.Template = (ControlTemplate)XamlReader.Parse(template); }
由于我们使用字符串来指定模板的XAML代码,因此我们可以使用XamlReader的Parse方法。 XamlReader还有一个Load方法,主要用于流或XAML或XML读取器。 请注意,我们必须包含XML命名空间http://schemas.microsoft.com/winfx/2006/xaml/presentation,因为我们需要在那里定义ControlTemplate,Border和其他控件。 如果我们不包含它,我们将遇到运行时exception。 基本上,我们必须放置模板所需的命名空间。
如果您只需要更改按钮图像,那么您可以做一件事。
- 创建一个依赖项属性,它将表示您想要更改图像的时间(bool),或者您可以创建一个包含所有可能图像的枚举
- 枚举图像{Image1 = 0,Image2 = 1,Image2 = 3}。 创建此类型的依赖项属性“CurrentButtonImage”,它将与button关联。
现在在XAML中使用此按钮模板
在属性Change of CurrentButtonImage更新按钮的图像(在代码后面)使用
CurrentImagePropertyChangedhandler(....,...) { switch(CurrentButtonImage) { case "Image1" : this._ButtonImage.Fill = (DrawingBrush)csd.FindResource("Image1DrawingBrush"); break; } }