【问题标题】:Accessing a given child of a ControlTemplate programmatically以编程方式访问 ControlTemplate 的给定子项
【发布时间】:2012-12-08 11:04:49
【问题描述】:

我有这个 ControlTemplate,其中包含我希望能够以编程方式访问的内容(在本例中为渐变),经过数小时的反复试验,我觉得终于到了向您寻求帮助的时候了,StackOverflow。

模板生成了一朵花,我不知道用什么,所以我只选择了拇指元素,因为我以前以类似的方式使用过它。如果您能想到其他更适合的方法,请告诉我。

无论如何,这是我的 ControlTemplate 的开始,来自 XAML 文件:

<ControlTemplate x:Key="cherryFlowerStyle" TargetType="{x:Type Thumb}">
                        <Viewbox Width="119.560" Height="114.268" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
                            <Canvas Width="119.560" Height="114.268">
                                <Canvas>
                                    <!-- Layer 1/<Path> -->
                                    <Path Data="... (removed to save space) ...">
                                        <Path.Fill>
                                            <RadialGradientBrush x:Name="cherryFlowerColorGradient" MappingMode="Absolute" GradientOrigin="593.380,333.416" Center="593.380,333.416" RadiusX="36.460" RadiusY="36.460">
                                                <RadialGradientBrush.GradientStops>
                                                    <!-- Flower color -->
                                                    <GradientStop x:Name="cherryFlowerColorGradientOuterColor" Offset="0.15" Color="#ffd6e062"/>

这就是我在 C# 中所做的:

Thumb flower = new Thumb();
flower.Template = TryFindResource("cherryFlowerStyle") as ControlTemplate;
GradientStop grStop = (GradientStop)flower.Template.FindName("cherryFlowerColorGradientOuterColor", flower);
                        Console.WriteLine("gradient: " +grStop);

创建一个新的拇指并应用模板作品(它在画布上画成一朵花)。 但是,尝试访问模板内的渐变是行不通的。我希望有一个好的解决方案,否则我必须以丑陋的方式去做;在屏幕外创建一朵花(在 XAML 中)并在代码隐藏中引用它,因为它有效:/

提前致谢!

【问题讨论】:

    标签: c# wpf controltemplate code-behind


    【解决方案1】:

    这是行不通的,因为 Gradient 不是模板的子级,它是模板子级的属性值。因此,您可以通过名称访问Path,并修改其Fill 值。但请记住,梯度可能会被冻结。 为什么不使用绑定和 DataContext 呢?或者更好的是,使用依赖属性直接修改颜色并使用 TemplateBinding。这将是一种更好的处理方式,而且工作量更少。 Thumb 元素也用于移动元素,它封装了鼠标处理,如果您不需要 Control 元素将是一个更好的基类。如果你想要性能,VisualContainerVisual 会好很多,但也很有限。

    【讨论】:

    • 感谢您的回答。所以你的意思是我可以使用这个东西“依赖属性”来修改我的 ControlTemplate 中的给定元素?我在哪里编写这段代码,我是为它创建一个新的 .cs 文件还是去哪里?顺便说一句,我尝试访问路径元素,但它不起作用:/这是我尝试的:System.Windows.Shapes.Path path = (System.Windows.Shapes.Path)flower.Template.FindName(" pathName123", 花);
    • 它没用从来都不是一个好的答案。依赖属性是 WPF 的基石之一。我会建议您获得有关 WPF 的更多基础知识。简短的回答; DepProps 用于绑定、动画并且是控件的一部分,实际上您已经使用了很多 depprops,您在 xaml 中设置值的每个属性几乎总是一个依赖属性。是的,depprops 可以在custom control 的代码隐藏文件中访问,并且可以通过TemplateBinding 绑定
    • 好吧,我想我得再研究一下这个话题了。感谢您的帮助。
    猜你喜欢
    • 2011-01-03
    • 2014-12-15
    • 2011-02-01
    • 2010-09-05
    • 1970-01-01
    • 1970-01-01
    • 2011-05-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多