【问题标题】:Modifying non-dependency properties in WPF XAML修改 WPF XAML 中的非依赖属性
【发布时间】:2020-02-22 06:13:50
【问题描述】:

如果这是一个愚蠢的问题,我很抱歉,因为我是 XAML 和 WPF 的新手。

所以这是我的问题的一个例子:

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

我想像上面的 XAML 行一样修改背景颜色的 alpha。但它说 A 不是 DependencyProperty。如何在上面的示例中修改 Background.(Color.A) ,还是不可能?请提出建议。

【问题讨论】:

  • 您可以改用ColorAnimation
  • 我只想改变颜色的Alpha通道。不是 R、G 或 B 通道。
  • 您可以创建一个附加的DependencyProperty,它将通过代码操作您的Alpha通道您可以考虑以一种可以使用@的方式组合一些边框987654324@ 属性,而不是 DependencyProperty。作为新手,第二种方法可能更容易,而第一种方法会在此过程中教给您宝贵的经验。我会试着举一个简单的例子。
  • 更简单:为背景画笔的不透明度设置动画。

标签: c# wpf xaml


【解决方案1】:

克莱门斯的回答有你想要的效果。但您也可以通过创建 AttachedProperty 为 Alpha 通道设置动画。了解此技术还可以让您在 ScrollViewer 等中设置滚动动画。

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>

【讨论】:

  • 要明确一点:结果与 Clemens 的解决方案完全相同相同。但是恕我直言,如果您真的想成为 WPF 开发人员,您应该尽早了解和理解依赖属性。
  • 我应该把xmlns:anim=""放在哪里?
【解决方案2】:

您可以简单地在边框背景中为 SolidColorBrush 的 Opacity 设置动画,而不是为 Color 的 alpha 值设置动画:

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

对 Opacity 属性使用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>

【讨论】:

  • 这是整个背景的不透明度。即使不透明度为 1,颜色 #00ffffff 仍然不可见。 +1,因为我刚刚从中得到了一个想法。
  • 当然,这是 SolidColorBrush 的不透明度。不要将它与边框元素的不透明度混淆。如果您以某种方式为颜色的 alpha 通道设置了动画,那也将是“整个背景”的不透明度。 SolidColorBrush 的颜色当然必须完全不透明,例如 #FFFFFFFF。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2014-05-23
相关资源
最近更新 更多