如何在代码中设置控制模板?

我在XAML中有这个

   

我想在C#代码中实现相同的function。 我怎样才能做到这一点?

 ControlTemplate ct = new ControlTemplate();.. Image img = new Image();.. 

现在如何将此图像分配给控制模板? 我们能做到这一点还是我错过了这里的任何概念?

在代码隐藏中创建模板不是一个好主意,理论上可以通过定义ControlTemplate.VisualTreeFrameworkElementFactory

 ControlTemplate template = new ControlTemplate(typeof(Button)); var image = new FrameworkElementFactory(typeof(Image)); template.VisualTree = image; 

由于您需要使用SetValueSetBinding分配属性非常迂回:

 image.SetValue(Image.SourceProperty, ...); 

此外,关于(以前)接受的答案和引用的东西:

以编程方式设置ControlTemplate就像使用XAML一样,因为我们必须使用XamlReader类。

那句话是错的,我们不“必须”


如果我在运行时分配模板,我将它们定义为一个资源,如果我需要它我可以加载。


编辑:根据文档FrameworkElementFactory不推荐使用:

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

我想知道这个建议是不是一个好主意。 我个人仍然会将模板定义为XAML中的资源,如果我可以避免使用字符串和XamlReader

http://www.eggheadcafe.com/sample-code/SilverlightWPFandXAML/73fdb6a2-6044-4c43-8766-afa12618ddc1/set-controltemplate-programmatically.aspx

以编程方式设置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。 基本上,我们必须放置模板所需的命名空间。

如果您只需要更改按钮图像,那么您可以做一件事。

  1. 创建一个依赖项属性,它将表示您想要更改图像的时间(bool),或者您可以创建一个包含所有可能图像的枚举
  2. 枚举图像{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; } }