Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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
Wpf 在代码隐藏中修改模板_Wpf - Fatal编程技术网

Wpf 在代码隐藏中修改模板

Wpf 在代码隐藏中修改模板,wpf,Wpf,在我们的应用程序中,我们使用第三方库组件。 我只需要更改整个模板中的一个值。在没有重新定义模板的情况下,我如何归档 例如,controlTemplate: <ControlTemplate TargetType="{x:Type Label}"> <Border x:Name="PART_MainBorder" BorderBrush="Black" BorderThickness="{Templ

在我们的应用程序中,我们使用第三方库组件。 我只需要更改整个模板中的一个值。在没有重新定义模板的情况下,我如何归档

例如,controlTemplate:

<ControlTemplate TargetType="{x:Type Label}">
        <Border x:Name="PART_MainBorder"
                BorderBrush="Black" 
                BorderThickness="{TemplateBinding BorderThickness}">
            <ContentPresenter/>
        </Border>            
</ControlTemplate>

我需要更改
PART\u MainBorder.BorderBrush
。我该怎么做

我已经找到了,但我不敢相信没有别的办法


谢谢。

我相信在XAML中有更优雅的方法来实现这一点,但要回答您的问题,模板只不过是一个cookie剪切器,所以您不能在代码隐藏中开始更改模板对象的属性。可以通过已应用模板的控件修改模板控件属性。在
ControlTemlate
的情况下,它将被模板化为控件,而对于
DataTemplate
,它将被
ContentPresenter
用于生成内容。假设您有2个
标签
,您在上面应用了模板:

<Label Content="A" x:Name="Label1"/>
<Label Content="B" x:Name="Label2"/>

值得注意的是,2个
标签
将有不同的
边框笔刷
颜色

我确信在XAML中有更优雅的方法来实现这一点,但要回答您的问题,模板只不过是一个cookie剪切器,所以您不能在代码隐藏中开始更改模板对象的属性。可以通过已应用模板的控件修改模板控件属性。在
ControlTemlate
的情况下,它将被模板化为控件,而对于
DataTemplate
,它将被
ContentPresenter
用于生成内容。假设您有2个
标签
,您在上面应用了模板:

<Label Content="A" x:Name="Label1"/>
<Label Content="B" x:Name="Label2"/>

值得注意的是,2个
标签
将有不同的
边框刷
颜色

不要过于复杂。我们有一个巨大的WPF应用程序,虽然我们一两次想要这个选项,但我们只是以“正常”的方式创建了一个新模板。这从来都不是问题。你想换什么?创建一个模板,在该模板中可以在外部设置每个必要的属性。一种很好的方法是使用带有附加属性的类来进一步自定义所使用的模板/样式。例如,创建一个LabelStyleService并给它一个BorderBrush附加属性,现在你可以编写它,这对我来说不是一个好主意,因为我们有几个主题,所以我需要重新定义4个模板。我可以做到这一点,但还有其他方法吗?为什么要为4个主题定义4个模板?我会按照@dowhilefor的建议,通过一行修改复制一次模板。不要走
FindName()
logicaltreeheloper.FindLogicalNode(…)
这条路就是不好。定义1个模板,并在模板中复制源库中您不想更改的所有内容,对于
BoderBrush
set
BorderBrush={dynamicResourcesomebrush}
。现在,在每一个主题中,都会有相应的画笔,并对你的主题进行排序。不要使事情过于复杂。我们有一个巨大的WPF应用程序,虽然我们一两次想要这个选项,但我们只是以“正常”的方式创建了一个新模板。这从来都不是问题。你想换什么?创建一个模板,在该模板中可以在外部设置每个必要的属性。一种很好的方法是使用带有附加属性的类来进一步自定义所使用的模板/样式。例如,创建一个LabelStyleService并给它一个BorderBrush附加属性,现在你可以编写它,这对我来说不是一个好主意,因为我们有几个主题,所以我需要重新定义4个模板。我可以做到这一点,但还有其他方法吗?为什么要为4个主题定义4个模板?我会按照@dowhilefor的建议,通过一行修改复制一次模板。不要走
FindName()
logicaltreeheloper.FindLogicalNode(…)
这条路就是不好。定义1个模板,并在模板中复制源库中您不想更改的所有内容,对于
BoderBrush
set
BorderBrush={dynamicResourcesomebrush}
。现在,在每个主题中,都会相应地添加一些笔刷,并对您的主题进行排序。谢谢您的回答,@dkozl!但在这里我需要将此属性设置为应用程序中的每个控件。。。我只希望更改应用于此类型的所有控件。模板控件只能通过已应用到的控件进行修改。如果这是你想要实现的,那么按照@dowhilefor在评论中的建议去做。谢谢你的回答,@dkozl!但在这里我需要将此属性设置为应用程序中的每个控件。。。我只希望更改应用于此类型的所有控件。模板控件只能通过已应用到的控件进行修改。如果这是你想要实现的,那么按照@dowhilefor在评论中的建议去做。