如何从样式触发器设置相关性属性

本文关键字:设置 相关性 属性 触发器 样式 | 更新日期: 2023-09-27 18:26:00

我正在创建一个具有以下样式集的自定义wpf控件。在后面的代码中,我有一个名为selected的依赖属性。当操作OnMouseLeftButtonDown触发器时,如何将此属性设置为true?

<Style TargetType="{x:Type local:myControl}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type local:myControl}">
                    <ControlTemplate.Resources>
                        <Storyboard x:Key="OnMouseLeftButtonDown">
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
                                <EasingColorKeyFrame KeyTime="0" Value="#FF9B1111"/>
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </ControlTemplate.Resources>
                    <ControlTemplate.Triggers>
                        <EventTrigger RoutedEvent="UIElement.MouseLeftButtonDown" SourceName="textBlock">
                            <BeginStoryboard Storyboard="{StaticResource OnMouseLeftButtonDown}"/>
                        </EventTrigger>
                        <EventTrigger RoutedEvent="UIElement.MouseLeftButtonDown" SourceName="textBlock2">
                            <BeginStoryboard Storyboard="{StaticResource OnMouseLeftButtonDown}"/>
                        </EventTrigger>
                    </ControlTemplate.Triggers>
                    <Border Background="{TemplateBinding Background}"
                            BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}">
                        <Border Name="border" BorderBrush="#FFDEDEDE" BorderThickness="1" Margin="1" >
                            <StackPanel Orientation="Horizontal">
                                <TextBlock Name="textBlock" HorizontalAlignment="Left" Margin="2,1,2,3" Text="{TemplateBinding ElementName}" TextWrapping="Wrap" VerticalAlignment="Top" Foreground="#FF7C8CF1"  FontSize="10" FontWeight="Bold"></TextBlock>
                                <TextBlock Name="textBlock2" HorizontalAlignment="Left" Margin="2,1,2,3" Text="{TemplateBinding ElementText}" TextWrapping="Wrap" VerticalAlignment="Top" Foreground="#FF75757A" FontSize="10" FontWeight="Bold"></TextBlock>
                            </StackPanel>
                        </Border>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

如何从样式触发器设置相关性属性

StoryboardOnMouseLeftButtonDown中,您可以添加ObjectAnimationUsingKeyFrames。样品:

<Storyboard x:Key="OnMouseLeftButtonDown">
    <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)" Storyboard.TargetName="border">
        <EasingColorKeyFrame KeyTime="0" Value="#FF9B1111"/>
    </ColorAnimationUsingKeyFrames>
    <!-- xmlns:sys="clr-namespace:System;assembly=mscorlib" -->
    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="YouTarget" Storyboard.TargetProperty="NameOfYourProperty">
        <DiscreteObjectKeyFrame KeyTime="0:0:0">
            <DiscreteObjectKeyFrame.Value>
                <sys:Boolean>True</sys:Boolean>
            </DiscreteObjectKeyFrame.Value>
        </DiscreteObjectKeyFrame>
    </ObjectAnimationUsingKeyFrames>
</Storyboard>

对于附加的依赖属性,必须这样写:

Storyboard.TargetProperty="(local:YourDependecyClass.IsSampleMyProperty)"

我最终以另一种方式完成了这项工作。我将控件的名称更改为PART_ElementName和PART_ElementText。我在OnApplyTemplate()方法中执行了以下操作

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            _elementName = Template.FindName("PART_ElementName", this) as TextBlock;
            _elementText = Template.FindName("PART_ElementText", this) as TextBlock;
            if (_elementName != null) _elementName.MouseLeftButtonDown += (sender, args) => SelectControl();
            if (_elementText != null) _elementText.MouseLeftButtonDown += (sender, args) => SelectControl();
        }

然后我在SelectControl()方法

中进行更改