Как использовать datatrigger для прямоугольника в пользовательском контроле в c # wpf? - PullRequest
0 голосов
/ 31 мая 2019

Я создал UserControl со сложным прямоугольником в wpf c #, и я хочу запустить анимацию с помощью datatrigger, который является boud для свойства. Если я использую eventtrigger внутри прямоугольника, он может работать как положено, но если я переключусь на datatrigger, он не смог оживить прямоугольник ... Для анимации укажите @Val, который разместил WPF движущуюся стрелку с изменением направления

  1. Я пытался включить раскадровку в и использовать _storyboard.begin () в коде, но не смог его анимировать.
  2. Я попытался включить раскадровку внутри объекта, который содержит источник данных, связанный с свойством с именем AnimationStart. А также я попытался поместить
  3. Я также реализовал либо INotifyPropertyChanged, либо DependencyProperty для AnimationStart, но до сих пор ни один из них не работал.
  4. Свойство DependencyProperty: IndicationPoints, LineBackgroundColor, LineBackColor работает правильно.

теперь xaml выглядит следующим образом

 <UserControl.Resources>
        <Style x:Key="animationStyle" TargetType="{x:Type Rectangle}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding AnimationStart}" Value="Start">
                    <DataTrigger.EnterActions>
                        <BeginStoryboard x:Name="StartAnimation">
                            <Storyboard>
                                <DoubleAnimation 
                                    From="0" 
                                    To="10" 
                                    RepeatBehavior="Forever"
                                    Storyboard.TargetProperty="(Rectangle.Fill).(VisualBrush.Transform).(TranslateTransform.X)" 
                                    Duration="0:0:0.1" />
                            </Storyboard>
                        </BeginStoryboard>
                    </DataTrigger.EnterActions>
                </DataTrigger>
                <DataTrigger Binding="{Binding AnimationStart}" Value="Stop">
                    <DataTrigger.EnterActions>
                        <StopStoryboard x:Name="StopAnimation" BeginStoryboardName="StartAnimation"/>
                    </DataTrigger.EnterActions>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </UserControl.Resources>

    <Rectangle x:Name="rectangleLine" Style="{StaticResource animationStyle}" Width="auto" Height="auto" Margin="0">
        <Rectangle.RenderTransform>
            <RotateTransform Angle="0" />
        </Rectangle.RenderTransform>
        <Rectangle.Fill>
            <VisualBrush TileMode="Tile" Viewport="0,0,10,8" ViewportUnits="Absolute" Viewbox="0,0,8,8" ViewboxUnits="Absolute">
                <VisualBrush.Transform>
                    <TranslateTransform X="0" Y="0" />
                </VisualBrush.Transform>
                <VisualBrush.Visual>
                    <Grid x:Name="gridMoving">
                        <Polygon x:Name="polygonMovingBack" Fill="{Binding LineBackColor}" Points="0,0 8,0 8,8 0,8" />
                        <Polygon x:Name="polygonMoving" Fill="{Binding LineBackgroundColor}" Points="{Binding IndicationShape}" />
                    </Grid>
                </VisualBrush.Visual>
            </VisualBrush>
        </Rectangle.Fill>
        <Rectangle.Resources>
            <Storyboard x:Key="startAnimation">
                <DoubleAnimation 
                    From="0" 
                    To="10" 
                    RepeatBehavior="Forever"
                    Storyboard.TargetProperty="(Rectangle.Fill).(VisualBrush.Transform).(TranslateTransform.X)" 
                    Duration="0:0:0.1" />
            </Storyboard>
        </Rectangle.Resources>

        <!--<Rectangle.Triggers>
            <EventTrigger RoutedEvent="Control.Loaded">
                <EventTrigger.Actions>
                    <BeginStoryboard>
                        <Storyboard>
                            <DoubleAnimation 
                                From="0" 
                                To="10" 
                                RepeatBehavior="Forever"
                                Storyboard.TargetProperty="(Rectangle.Fill).(VisualBrush.Transform).(TranslateTransform.X)" 
                                Duration="0:0:0.1" />
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>
        </Rectangle.Triggers>-->
    </Rectangle>

и код


        public PointCollection IndicationPoints
        {
            get
            {
                return (PointCollection)GetValue(IndicationPointsProperty);
            }
            set
            {
                SetValue(IndicationPointsProperty, value);
            }
        }
        public SolidColorBrush LineBackgroundColor
        {
            get
            {
                return (SolidColorBrush)GetValue(LineBackgroundColorProperty);
            }
            set
            {
                SetValue(LineBackgroundColorProperty, value);
            }
        }
        public SolidColorBrush LineBackColor
        {
            get
            {
                return (SolidColorBrush)GetValue(LineBackColorProperty);
            }
            set
            {
                SetValue(LineBackColorProperty, value);
            }
        }
        public string AnimationStart {
            get => _animationStart;
            set {
                _animationStart = value;
                NotifyPropertyChanged("AnimationStart");
            } }

        private string _animationStart;

        public event PropertyChangedEventHandler PropertyChanged;
        private void NotifyPropertyChanged(string info)
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(info));
            }
        }

        public static readonly DependencyProperty IndicationPointsProperty
            = DependencyProperty.Register("IndicationPoints", typeof(PointCollection), typeof(UI_MovingLine), new PropertyMetadata(new PointCollection(new List<Point> { new Point(0,0), new Point(4, 0), new Point(8, 4), new Point(4, 8), new Point(0, 8), new Point(4, 4) }), new PropertyChangedCallback(OnIndicationPointsChanged)));

        public static readonly DependencyProperty LineBackgroundColorProperty
            = DependencyProperty.Register("LineBackgroundColor", typeof(SolidColorBrush), typeof(UI_MovingLine), new PropertyMetadata(new SolidColorBrush(Colors.Gray), new PropertyChangedCallback(OnLineBackgroundColorChanged)));

        public static readonly DependencyProperty LineBackColorProperty
            = DependencyProperty.Register("LineBackColor", typeof(SolidColorBrush), typeof(UI_MovingLine), new PropertyMetadata(new SolidColorBrush(Colors.Gray), new PropertyChangedCallback(OnLineBackColorChanged)));

        private static void OnIndicationPointsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = d as UI_MovingLine;
            control.OnIndicationPointsChanged(e);
        }

        private void OnIndicationPointsChanged(DependencyPropertyChangedEventArgs e)
        {
            polygonMoving.Points = (PointCollection)e.NewValue;
        }

        private static void OnLineBackgroundColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = d as UI_MovingLine;
            control.OnLineBackgroundColorChanged(e);
        }

        private void OnLineBackgroundColorChanged(DependencyPropertyChangedEventArgs e)
        {
            polygonMoving.Fill = (SolidColorBrush)e.NewValue;
        }

        private static void OnLineBackColorChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            var control = d as UI_MovingLine;
            control.OnLineBackColorChanged(e);
        }

        private void OnLineBackColorChanged(DependencyPropertyChangedEventArgs e)
        {
            polygonMovingBack.Fill = (SolidColorBrush)e.NewValue;
        }

        public UI_MovingLine()
        {
            InitializeComponent();
            gridMoving.DataContext = this;
            polygonMoving.DataContext = this;
            LineMovingToNomal();
        }

        public void LineMovingToNomal()
        {
            try
            {
                _transmitLineStatus = PowerSystem.TransmitLineStatus.TLS_NORMAL;
                IndicationPoints = new PointCollection(new List<Point> { new Point(0, 0), new Point(4, 0), new Point(8, 4), new Point(4, 8), new Point(0, 8), new Point(4, 4) });
                LineBackgroundColor = new SolidColorBrush(Colors.DodgerBlue);
                LineBackColor = new SolidColorBrush(Colors.White);

                AnimationStart = "Start";
            }
            catch
            {
            }
        }

1 Ответ

0 голосов
/ 31 мая 2019

Немного сложно помочь вам отследить это без MCVE , но попробуйте установить свойства RenderTransform и Fill с помощью установщиков внутри стиля, а не пытаться переопределить их в самом элементе управления Rectangle.

...