Изменение свойств вне зависимости в WPF XAML - PullRequest
0 голосов
/ 22 февраля 2020

Извините, если это глупый вопрос, потому что я новичок в XAML и WPF.

Так что это пример моего вопроса:

<ByteAnimation Storyboard.TargetName="Border" Storyboard.TargetProperty="Background.(Color.A)" Duration="0" To="255"/>

Я хочу изменить альфа цвета фона как в строке XAML выше. Но это говорит о том, что A не является DependencyProperty. Как я могу изменить Background. (Color.A) в примере выше, или это невозможно сделать? Пожалуйста, предложите.

Ответы [ 2 ]

1 голос
/ 22 февраля 2020

Ответ Клеменса дает желаемый эффект. Но вы также можете анимировать альфа-канал, создав AttachedProperty. Знание этой техники также позволит вам анимировать прокрутку в ScrollViewer et c.

namespace AlphaChannelAnimation
    {
    class AnimationProperties 
    {


        public static byte GetBackgroundAlpha(DependencyObject obj)
        {
            return (byte)obj.GetValue(BackgroundAlphaProperty);
        }

        public static void SetBackgroundAlpha(DependencyObject obj, byte value)
        {
            obj.SetValue(BackgroundAlphaProperty, value);
        }

        // Using a DependencyProperty as the backing store for BackgroundAlpha.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty BackgroundAlphaProperty =
            DependencyProperty.RegisterAttached("BackgroundAlpha", typeof(byte), typeof(AnimationProperties), new PropertyMetadata((byte)255, OnBackgroundAlphaChanged));

        private static void OnBackgroundAlphaChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            try
            {
                Color C = ((SolidColorBrush)((Border)d).Background).Color;
                ((Border)d).Background = new SolidColorBrush { Color = new Color() { R = C.R, G = C.G, B = C.B, A = (byte)e.NewValue } };
            } catch (Exception)
            {
                throw;
            }
        }
    }
}

Используйте это в вашем XAML:

...

xmlns:anim="clr-namespace:AlphaChannelAnimation"

...

        <Storyboard>
            <ByteAnimation
                Storyboard.TargetName="_BorderToAnimateAlpha"
                Storyboard.TargetProperty="(anim:AnimationProperties.BackgroundAlpha)"
                From="255"
                To="0"
                Duration="0:0:3" />
        </Storyboard>
1 голос
/ 22 февраля 2020

Вместо анимации альфа-значения Color, вы можете просто анимировать Opacity SolidColorBru sh на фоне границы:

<Border x:Name="Border">
    <Border.Background>
        <SolidColorBrush Color="Red"/>
    </Border.Background>
</Border>

Использовать DoubleAnimation для Свойство непрозрачности:

<DoubleAnimation
    Storyboard.TargetName="Border"
    Storyboard.TargetProperty="Background.Opacity"
    To="0" Duration="0:0:1"/>

Полный пример:

<Grid>
    <Grid.Triggers>
        <EventTrigger RoutedEvent="Loaded">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                        Storyboard.TargetName="Border"
                        Storyboard.TargetProperty="Background.Opacity"
                        To="0" Duration="0:0:1"/>
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Grid.Triggers>
    <Border x:Name="Border">
        <Border.Background>
            <SolidColorBrush Color="Red"/>
        </Border.Background>
    </Border>
</Grid>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...