【问题标题】:How to set a dependancy property from a style trigger如何从样式触发器设置依赖属性
【发布时间】:2013-08-02 11:52:41
【问题描述】:

我正在使用以下样式集创建自定义 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>

【问题讨论】:

  • public static readonly DependencyProperty SelectedProperty = DependencyProperty.Register("Selected", typeof (bool), typeof (XliffElement), new PropertyMetadata(default(bool))); public bool Selected { get { return (bool) GetValue(SelectedProperty); } set { SetValue(SelectedProperty, value); } }

标签: c# wpf


【解决方案1】:

在你的Storyboard OnMouseLeftButtonDown 你可以添加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)"

【讨论】:

  • 好的,在我的情况下,“YouTarget”是什么?
  • @John:您将属性设置到什么来源?
  • 我希望当他们单击控件上的任意位置时会发生这种情况。
  • @John:我的意思是,你想设置你的属性的目标是什么。您在 XAML 中的哪个位置设置属性的默认值?
  • 我不确定你的意思。与此同时,我想出了另一种方法来做到这一点。非常感谢它所付出的努力
【解决方案2】:

我最终以另一种方式做到了这一点。我将控件的名称更改为 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() 方法中进行更改

【讨论】:

    猜你喜欢
    • 2016-03-28
    • 2011-08-04
    • 1970-01-01
    • 2019-06-27
    • 2021-11-08
    • 2019-12-21
    • 2016-04-04
    • 2013-04-09
    • 2012-07-30
    相关资源
    最近更新 更多