2011-04-22 49 views
24

我有这样的XAML如何在代码中设置控制模板?

<ControlTemplate TargetType="{x:Type Button}"> 
    <Image ...> 
</ControlTemplate> 

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

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

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

回答

26

在代码隐藏中创建模板不是一个好主意,理论上可以通过定义ControlTemplate.VisualTree这是一个FrameworkElementFactory来做到这一点。

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

分配的属性是很婉转,因为你需要使用SetValueSetBinding

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

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

设置ControlTemplate 在编程上就像使用 XAML一样,因为我们必须使用 X amlReader类。

该陈述恰恰是错误的,我们没有“必须”


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


编辑:根据文档FrameworkElementFactory被弃用:

这个类是被废弃的方法以编程方式创建模板,其是FrameworkTemplate的子类,如控件模板或DataTemplate中;当您使用此类创建模板时,并非所有模板功能都可用。以编程方式创建模板的推荐方法是使用XamlReader类的Load方法从字符串或内存流中加载XAML。

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

+0

谢谢工作完美...我知道这不是一个好主意,但我在一个特定的情况下没有选择 – 2011-04-22 13:19:42

+0

嗯,我只是引用我发现的网站的文本形式..和使用'XamlReader.Parse '? – 2011-04-22 14:25:27

+0

@Ai_boy:它只是解析XAML,这是不必要的,也不是我会推荐的东西,如果您有静态XAML,最好将其创建为XAML资源,而不是将XML字符串窜改为代码隐藏。 – 2011-04-22 14:29:08

21

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 = 
     "<ControlTemplate xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
      TargetType=\"Button\">" + 
      "<Border>" + 
       "<ContentPresenter/>" + 
      "</Border>" + 
     "</ControlTemplate>"; 
    button.Template = (ControlTemplate)XamlReader.Parse(template); 
} 

由于我们使用的字符串指定 的XAML代码模板,我们可以 使用XamlReader的解析方法。 XamlReader也有一个Load方法, ,它主要用于流或者是 XAML或XML阅读器。注意我们 必须包含XML命名空间 http://schemas.microsoft.com/winfx/2006/xaml/presentation ,因为我们需要的ControlTemplate,Border, 和其他控件在那里定义为 。如果我们没有包含它,我们会 遇到运行时异常。 基本上,我们必须把 命名空间的模板。

0

如果您只需要更改按钮图像,那么您可以做一件事。
1.创建一个依赖项属性,它将表示何时想要更改图像(bool),或者可以创建一个包含所有可能图像的枚举: 2.枚举图像{Image1 = 0,Image2 = 1, Image2 = 3}。创建一个与按钮关联的这种类型的依赖项属性“CurrentButtonImage”。

在XAML

现在按钮模板

使用在CurrentButtonImage的属性更改更新使用

CurrentImagePropertyChangedhandler(...,...)按钮的图像(在后面的代码)
{
开关(CurrentButtonImage)
{
案 “IMAGE1”:
this._ButtonImage.Fill =(DrawingBrush)csd.FindResource(“Image1DrawingBrus H”);