替换WPF中的部分默认模板

是否有任何“最佳实践”方法来替换默认模板的一部分。 当前的用例是树视图。 默认情况下,树视图具有这种小三角形形状以展开和折叠。

如果我替换整个控件模板,我知道如何替换这些,如下面的代码所示。 我不确定是否有办法“保持所有默认值,只需更改XY”。 它不是一种风格,我基本上需要替换现有控件模板的一部分。

为了说明,请查看以下XAML。 第一个较小的块是我希望能够适应的相关XAML。

较大的第二和第三部分基本上是默认模板的副本,仅用于从头开始管理“已更改”部分。

有没有更好的方法来实现这一点,在下半年节省长而混乱的XAML?

                  

                                                            

不幸的是,我认为你必须更换整个模板:

来自MSDN: http : //msdn.microsoft.com/en-us/library/aa970773.aspx

Windows Presentation Foundation(WPF)中的控件具有ControlTemplate,其中包含该控件的可视树。 您可以通过修改该控件的ControlTemplate来更改控件的结构和外观。 没有办法只替换控件的部分可视树; 要更改控件的可视树,必须将控件的Template属性设置为新的完整ControlTemplate。

实际上有一种方式(有点)。 您可以创建自己的自定义控件并覆盖OnApplyTemplate函数以动态更改样式。

例如,像这样创建一个自定义控件(我在Silverlight中这样做,但我认为它是完全一样的):

 namespace SilverlightClassLibrary1 { public class MyButton: Button { public string BackgroundColor { get; set; } public override void OnApplyTemplate() { base.OnApplyTemplate(); if (BackgroundColor != null) { Rectangle r = this.GetTemplateChild("BackgroundGradient") as Rectangle; if (r != null) { r.Fill = new SolidColorBrush(Color.FromArgb(255, Convert.ToByte(BackgroundColor.Substring(1,2),16), Convert.ToByte(BackgroundColor.Substring(3,2),16), Convert.ToByte(BackgroundColor.Substring(5,2),16))); } } } } } 

有趣的部分是GetTemplateChild方法,它正在寻找名为“BackgroundGradient”的Rectangle控件。 (顺便说一句,如果你在一个单独的项目中定义自定义控件会更容易,所以如果你还没有这样做,那么创建一个新的“Silverlight类库”项目并把它放到那个项目中。)

然后添加一个新的资源字典文件并覆盖控件模板,并确保您有一个名为“BackgroundGradient”的矩形。 在这种情况下,我们使用标准按钮控件模板,我已经减少了一点:

    

因此,如果您愿意,您现在可以声明一个按钮控件并覆盖一个样式:

  Normal Button 1 Normal Button 2 Customized Background 

我认为你可以变得更聪明,并通过资源名称或样式名称并动态加载它。

然后,您需要将资源文件包含在应用程序中:

          

并且您将在XAML设计器中看到自定义属性更改。

我会将您的模板重新设计为自定义控件,使用ContentPresenters作为将要更改的元素的占位符。

要使用这些占位符,必须将它们链接到依赖项属性。

查看此post以了解如何完成此操作

http://www.codeproject.com/Articles/82464/How-to-Embed-Arbitrary-Content-in-a-WPF-Control

“使用自定义控件”解释了我的方法