Как я могу получить CompositionEffect с учетом FrameworkElement?

Я экспериментирую со связанным эффектом и устанавливаю его для элемента управления Image (TestImage) как таковой:

    private void TestImage_ImageOpened(object sender, RoutedEventArgs e)
    {
        /*
            (input) Backdrop -> GaussianBlur -> |
                                 ColorSource -> | Blend -> Saturation (output)
         */

        var compositor = ElementCompositionPreview.GetElementVisual(this.TestImage).Compositor;

        var blurEffect = new GaussianBlurEffect()
        {
            Name = "Blur",
            BlurAmount = 10f,
            BorderMode = EffectBorderMode.Hard,
            Optimization = EffectOptimization.Balanced,
            Source = new CompositionEffectSourceParameter("source"),
        };

        var colorEffect = new ColorSourceEffect
        {
            Name = "Tint",
        };

        var blendEffect = new BlendEffect
        {
            Background = blurEffect,
            Foreground = colorEffect,
            Mode = BlendEffectMode.Overlay,
        };

        var saturationEffect = new SaturationEffect
        {
            Name = "Saturation",
            Source = blendEffect,
            Saturation = 1.5f,
        };

        var factory = compositor.CreateEffectFactory(saturationEffect, new[]
        {
            "Blur.BlurAmount",
            "Tint.Color",
            "Saturation.Saturation",
        });

        var brush = factory.CreateBrush();
        brush.SetSourceParameter("source", compositor.CreateBackdropBrush());

        // Animatable properties
        brush.Properties.InsertScalar("Blur.BlurAmount", 10f);
        brush.Properties.InsertColor("Tint.Color", Color.FromArgb(128, 255, 0, 0));
        brush.Properties.InsertScalar("Saturation.Saturation", 1.5f);

        var sprite = compositor.CreateSpriteVisual();
        sprite.Brush = brush;
        sprite.Size = new Vector2((float)this.TestImage.ActualWidth, (float)this.TestImage.ActualHeight);
        ElementCompositionPreview.SetElementChildVisual(this.TestImage, sprite);
    }

Моя цель — получить этот эффект позже, чтобы я мог прочитать некоторые значения этого эффекта. Как я могу получить эффект, используя только элемент управления TestImage и слой композиции?


person Maximus    schedule 18.07.2019    source источник
comment
Я смущен, почему вы хотите получить значение эффекта? Вы хотите отредактировать значение и повторно отобразить?   -  person Nico Zhu - MSFT    schedule 19.07.2019
comment
Я создаю библиотеку анимации, поэтому у меня есть функция, которая мне нужна, чтобы получить эффект и установить новые значения для повторного применения.   -  person Maximus    schedule 19.07.2019
comment
В настоящее время UWP не содержит такого API, который мог бы получить объект эффекта, а затем повторно применить его, я предлагаю вам опубликовать свою функцию в UserVoice. После того, как вы представили эту функцию в Uservoice, я надеюсь, что вы сможете поделиться ссылкой на это дело здесь, таким образом члены сообщества, у которых есть такое же требование, могут проголосовать за эту функцию, чтобы Microsoft повысила приоритет для нее.   -  person Nico Zhu - MSFT    schedule 23.07.2019
comment
Спасибо за информацию. Я прибегал к использованию AttachedProperty, чтобы обойти это.   -  person Maximus    schedule 25.07.2019


Ответы (1)


Я решил свою проблему, используя прикрепленное свойство, поскольку эта функция изначально не поддерживается:

internal static SpriteVisual GetSprite(DependencyObject obj) => (SpriteVisual)obj.GetValue(SpriteProperty);

internal static void SetSprite(DependencyObject obj, SpriteVisual value) => obj.SetValue(SpriteProperty, value);

/// <summary>
/// Composition Sprite attached to a FrameworkElement.
/// </summary>
internal static readonly DependencyProperty SpriteProperty =
    DependencyProperty.RegisterAttached(
        "Sprite",
        typeof(SpriteVisual),
        typeof(MyAnimations),
        new PropertyMetadata(null));
person Maximus    schedule 25.07.2019