以 xaml 定义的样式访问元素

Accessing elements in a xaml defined style

我按照 Codeproject 上的 DiagramDesigner 示例学习了如何在 WPF 中使用 Adorners,因为它比较符合我的很多需求。

我对实现做了一些调整,还添加了我自己的装饰器,用于通过滑块(装饰器上的滑块)控制控件的不透明度。

按照与作者相同的方法,我将滑块和其他功能放在 xaml 样式定义文件中,如下所示。我现在正在努力 A) 弄清楚如何在任何级别访问滑块,B) 如何最好地开始将其与将用于各种设置(在装饰器上)的底层 Viewmodel 连接起来。

<Style x:Key="OpacityAdorner" TargetType="{x:Type adorners:OpacityChrome}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type adorners:OpacityChrome}">
                <Grid>
                    <Slider x:Name="OpacitySlider" Style="{StaticResource OpacityControl}" ToolTip="Alter the opacity of the image to overlay with other images" Visibility="Collapsed"/>
                    <Ellipse x:Name="OpacitySliderEnable" Style="{StaticResource OpacityIcon}" ToolTip="Alter the visual opacity of the image" Visibility="Visible"/>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

代码项目示例在这里http://www.codeproject.com/Articles/22952/WPF-Diagram-Designer-Part

A) 使用类似于以下代码片段的内容从应用的模板中获取滑块。

var slider = opacityAdorner.Template.FindName("OpacitySlider", opacityAdorner) as Slider;

有些情况下模板尚未应用,在这种情况下,您需要在上一次调用之前执行以下操作:

opacityAdorner.ApplyTemplate();

B) 连接视图模型的最佳方法(在我看来)是在 OpacityChrome 装饰器上将所需属性公开为 依赖属性 。然后,您使用普通 Binding 将新属性连接到视图模型,并使用 TemplateBinding 将它们连接到模板元素。