Как вы анимируете свойство в пользовательском элементе управления в UWP? - PullRequest
0 голосов
/ 05 марта 2020

Я хочу анимировать Bru sh в пользовательском элементе управления. Непрозрачность bru sh связана с bru sh следующим образом:

<Style TargetType="trrfc:CustomControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="trrfc:PriceControl">
                <Grid>
                    <Border Background="Red"
                            Opacity="{TemplateBinding MaskOpacity"}/>
                    <Border BorderBrush="{TemplateBinding BorderBrush}"
                            BorderThickness="{TemplateBinding BorderThickness}"
                            Padding="{TemplateBinding Padding}">
                        <ContentPresenter />
                    </Border>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

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

namespace ThetaRex.Radar.Forms.Controls
{
    using System;
    using Windows.UI.Xaml;
    using Windows.UI.Xaml.Controls;
    using Windows.UI.Xaml.Hosting;
    using Windows.UI.Xaml.Media;

    public class CustomControl : ContentControl
    {
        public static readonly DependencyProperty ValueProperty = DependencyProperty.Register(
            "Value",
            typeof(decimal),
            typeof(CustomControl),
            new PropertyMetadata(default(decimal), new PropertyChangedCallback(CustomControl.OnValuePropertyChanged)));

        public static readonly DependencyProperty MaskBackgroundProperty = DependencyProperty.Register(
            nameof(CustomControl.MaskBackground),
            typeof(Brush),
            typeof(CustomControl),
            new PropertyMetadata(default(Brush)));

        public static readonly DependencyProperty MaskOpacityProperty = DependencyProperty.Register(
            nameof(CustomControl.MaskOpacity),
            typeof(float),
            typeof(CustomControl),
            new PropertyMetadata(default(float)));

        public CustomControl()
        {
            // This allows the control to pick up a template.
            this.DefaultStyleKey = typeof(CustomControl);
        }

        public decimal Value
        {
            get => (decimal)this.GetValue(CustomControl.ValueProperty);
            set => this.SetValue(CustomControl.ValueProperty, value);
        }

        public Brush MaskBackground
        {
            get => this.GetValue(CustomControl.MaskBackgroundProperty) as Brush;
            set => this.SetValue(CustomControl.MaskBackgroundProperty, value);
        }

        public float MaskOpacity
        {
            get => (float)this.GetValue(CustomControl.MaskOpacityProperty);
            set => this.SetValue(CustomControl.MaskOpacityProperty, value);
        }

        private static void OnValuePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            CustomControl priceControl = dependencyObject as CustomControl;
            var priceControlVisual = ElementCompositionPreview.GetElementVisual(priceControl);
            var compositor = priceControlVisual.Compositor;

            // Start a new animation that will flash an opaque background, then slowly fade to transparent.
            var opacityAnimation = compositor.CreateScalarKeyFrameAnimation();
            opacityAnimation.Duration = TimeSpan.FromSeconds(10.0);
            opacityAnimation.InsertKeyFrame(0.0f, 1.0f, compositor.CreateLinearEasingFunction());
            opacityAnimation.InsertKeyFrame(1.0f, 0.0f, compositor.CreateLinearEasingFunction());
            priceControlVisual.StartAnimation(nameof(priceControl.MaskOpacity), opacityAnimation);
        }
    }
}

Когда я запускаю при этом я получаю сообщение об ошибке:

The parameter is incorrect. The specified property was not found or cannot be animated. Context: MaskOpacity Expression: MaskOpacity Start Position: 0, End Position: 11

Этот код работает, как и ожидалось, если я анимирую прозрачность всего элемента управления, указав priceControl.Opacity в StartAnimation вызов. У кого-нибудь есть пример или подсказка, как вы анимируете свойства на пользовательских элементах управления, таких как MaskOpacity ?

1 Ответ

0 голосов
/ 06 марта 2020

Как вы анимируете свойство в пользовательском элементе управления в UWP?

Мы не можем использовать Composition api для пользовательского свойства анимации. А для вашего требования лучший способ - использовать Storyboard для анимации указанного c пограничного контроля со значением MaskOpacity. Пожалуйста, обратитесь к следующему коду.

public static Border RootBorder { get; set; }
protected override void OnApplyTemplate()
{
    base.OnApplyTemplate();
    // give the border x:Name RootBorder.
    RootBorder = GetTemplateChild("RootBorder") as Border;

}
private static void OnValuePropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
{
    var duration = new Duration(TimeSpan.FromSeconds(10));
    var ease = new CubicEase { EasingMode = EasingMode.EaseOut };
    var animation = new DoubleAnimation
    {
        EasingFunction = ease,
        Duration = duration
    };

    var conStoryboard = new Storyboard();
    conStoryboard.Children.Add(animation);
    animation.From = 1.0f;
    animation.To = (double)dependencyObject.GetValue(MaskOpacityProperty);
    animation.EnableDependentAnimation = false;
    Storyboard.SetTarget(animation, RootBorder);
    Storyboard.SetTargetProperty(animation, "Opacity");
    conStoryboard.Begin();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...