Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在代码中设置控件模板?_C#_Wpf_Xaml_Contentcontrol - Fatal编程技术网

C# 如何在代码中设置控件模板?

C# 如何在代码中设置控件模板?,c#,wpf,xaml,contentcontrol,C#,Wpf,Xaml,Contentcontrol,我有这个XAML版本 <ControlTemplate TargetType="{x:Type Button}"> <Image ...> </ControlTemplate> 现在,如何将此图像分配给控制模板?我们能做到这一点吗?还是我在这里遗漏了任何概念? 设置控件模板 编程就像使用 因为我们必须使用 XamlReader类。例如,这里是 设置按钮模板的代码, 假设我们想设定一个 按钮加载后的模板 private void按钮\u已加载(对象发送

我有这个XAML版本

<ControlTemplate TargetType="{x:Type Button}">
    <Image ...>
</ControlTemplate>
现在,如何将此图像分配给控制模板?我们能做到这一点吗?还是我在这里遗漏了任何概念?

设置控件模板 编程就像使用 因为我们必须使用 XamlReader类。例如,这里是 设置按钮模板的代码, 假设我们想设定一个 按钮加载后的模板

private void按钮\u已加载(对象发送方,路由目标){
var按钮=发送方为按钮;
字符串模板=
"" +
"" +
"" +
"" +
"";
模板=(控制模板)XamlReader.Parse(模板);
}
因为我们使用字符串来指定 模板的XAML代码,我们可以 使用XamlReader的解析方法。这个 XamlReader还有一个加载方法, 主要用于溪流或河流 XAML或XML读取器。注意,我们 必须包含XML名称空间 因为ControlTemplate、Border、, 定义了我们需要的其他控件 那里如果我们不包括它,我们将 遇到运行时异常。 基本上,我们必须把 模板所需的名称空间


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

  • 创建一个依赖项属性,该属性将在需要时表示 更改图像(bool)或创建一个具有 所有可能的图像都显示
  • 枚举图像{Image1=0,Image2=1,Image2=3}。创建此类型的依赖项属性“CurrentButtonImage”,该属性将与按钮关联
  • 现在在XAML中使用这个按钮模板

    更改CurrentButtonImage的属性时,使用


    在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, ...);