0

我有这个 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 中)并在代码隐藏中引用它,因为它有效:/

提前致谢!

4

1 回答 1

0

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

于 2012-12-08T03:04:49.747 回答