C# 如何在代码中设置控件模板?
我有这个XAML版本C# 如何在代码中设置控件模板?,c#,wpf,xaml,contentcontrol,C#,Wpf,Xaml,Contentcontrol,我有这个XAML版本 <ControlTemplate TargetType="{x:Type Button}"> <Image ...> </ControlTemplate> 现在,如何将此图像分配给控制模板?我们能做到这一点吗?还是我在这里遗漏了任何概念? 设置控件模板 编程就像使用 因为我们必须使用 XamlReader类。例如,这里是 设置按钮模板的代码, 假设我们想设定一个 按钮加载后的模板 private void按钮\u已加载(对象发送
<ControlTemplate TargetType="{x:Type Button}">
<Image ...>
</ControlTemplate>
现在,如何将此图像分配给控制模板?我们能做到这一点吗?还是我在这里遗漏了任何概念?
设置控件模板
编程就像使用
因为我们必须使用
XamlReader类。例如,这里是
设置按钮模板的代码,
假设我们想设定一个
按钮加载后的模板
private void按钮\u已加载(对象发送方,路由目标){
var按钮=发送方为按钮;
字符串模板=
"" +
"" +
"" +
"" +
"";
模板=(控制模板)XamlReader.Parse(模板);
}
因为我们使用字符串来指定
模板的XAML代码,我们可以
使用XamlReader的解析方法。这个
XamlReader还有一个加载方法,
主要用于溪流或河流
XAML或XML读取器。注意,我们
必须包含XML名称空间
因为ControlTemplate、Border、,
定义了我们需要的其他控件
那里如果我们不包括它,我们将
遇到运行时异常。
基本上,我们必须把
模板所需的名称空间
如果您只需要更改按钮图像,那么您可以做一件事
在codebehind中创建模板不是一个好主意,理论上可以通过定义
ControlTemplate.VisualTree
来实现这一点,它是一个
由于需要使用SetValue
和SetBinding
,因此分配属性非常复杂:
image.SetValue(Image.SourceProperty, ...);
另外,关于(先前)接受的答案和引用的内容:
设置控件模板
编程就像使用
因为我们必须使用
XamlReader类
这种说法是错误的,我们没有“必须”
如果我在运行时分配模板,我会将它们定义为一种资源,如果需要可以加载
编辑:根据不推荐使用的文档: 该类是一种不推荐使用的以编程方式创建模板的方法,模板是框架模板的子类,如ControlTemplate或DataTemplate;使用此类创建模板时,并非所有模板功能都可用。以编程方式创建模板的推荐方法是使用XamlReader类的load方法从字符串或内存流加载XAML
我想知道这个建议是否是个好主意。就我个人而言,如果我可以避免使用字符串,并且
XamlReader
非常好地工作,那么我仍然会将模板定义为XAML中的资源。。。我知道这不是一个好主意,但在一个特定的情况下我别无选择。好吧,我只是引用我找到的网站上的文字。。使用XamlReader.Parse
又有什么错呢?@Ai_-boy:这只是对XAML的解析,这既不必要,也不是我推荐的,如果你有静态XAML,最好将其创建为一个XAML资源,而不是将XML字符串破解成代码。@h-b哦,我明白了。。我认为“dinamic”Xaml不适用于商业应用程序,所以。。这两种方法对我来说都像是“肮脏的黑客”。。无论如何,谢谢你的回答。
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);
}
CurrentImagePropertyChangedhandler(....,...)
{
switch(CurrentButtonImage)
{
case "Image1" :
this._ButtonImage.Fill = (DrawingBrush)csd.FindResource("Image1DrawingBrush");
break;
}
}
ControlTemplate template = new ControlTemplate(typeof(Button));
var image = new FrameworkElementFactory(typeof(Image));
template.VisualTree = image;
image.SetValue(Image.SourceProperty, ...);