【问题标题】:InvalidOperationException for ColorAnimation for WPF Grid.Background inside ControlTemplateControlTemplate 内 WPF Grid.Background 的 ColorAnimation 的 InvalidOperationException
【发布时间】:2017-01-19 14:41:57
【问题描述】:

我正在自定义常用的 WPF GroupBox 控件。当鼠标指针进入控制区域时,我需要为其背景实现彩色动画 - 比如说,慢慢地将背景颜色更改为预定义的颜色(让它变成粉红色)。我为此创建了一个自定义控件模板,其基本部分如下所示:

<ControlTemplate TargetType="{x:Type GroupBox}">
    <Grid Name="MainGrid" SnapsToDevicePixels="true">
        <!-- Control layout stuff with ContentPresenter -->
    </Grid>

    <ControlTemplate.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <ColorAnimation
                        Storyboard.TargetName="MainGrid"
                        Storyboard.TargetProperty="Background.(SolidColorBrush.Color)"
                        To="Pink" Duration="0:0:1" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </ControlTemplate.Triggers>
</ControlTemplate>

但是,我无法制作此动画。我总是得到一个未处理的异常类型:

'System.InvalidOperationException' 发生在 PresentationFramework.dll 附加信息如下: “背景”属性未指向路径中的 DependencyObject '背景。(0)'

我用谷歌搜索了这个问题。看来,我需要为 TargetProperty 使用正确的语法来制作动画。但是,我尝试了很多变体,例如以下变体,但它们都不适用于我的情况:

  • Background.Color
  • (Panel.Background).Color
  • (Panel.Background).(SolidColorBrush.Color)
  • (Grid.Background).(SolidColorBrush.Color)

我的搜索方向不对吗?

【问题讨论】:

  • 只要使用TargetProperty=Background 就可以了。如果它无法将Pink 识别为画笔,您可能需要为此使用StaticResource,但只要它是预定义的颜色名称,它就应该单独使用名称。
  • @Adwaenyth,确定它不起作用。附加信息:“System.Windows.Media.Animation.ColorAnimation”动画对象不能用于动画属性“背景”,因为它的类型不兼容“System.Windows.Media.Brush”。
  • Mh... 试试Storyboard.TargetProperty=(GroupBox.Background).(SolidColorBrush.Color),然后如here 所述那样有效吗?
  • @Adwaenyth,在 PresentationFramework.dll 中仍然发生了相同的“System.InvalidOperationException”类型的未处理异常。附加信息:“Background”属性不指向路径“(0).(1)”中的 DependencyObject。

标签: wpf background-color controltemplate invalidoperationexception coloranimation


【解决方案1】:

您的 TargetElement 需要在其样式中使用初始 Setter 才能使动画正常工作。

示例

<GroupBox>
        <GroupBox.Style>
            <Style TargetType="GroupBox">
                <Style.Setters>
                    <Setter Property="Template">
                        <Setter.Value>
                            <ControlTemplate TargetType="{x:Type GroupBox}">
                                <Grid Name="MainGrid" SnapsToDevicePixels="true">
                                    <Grid.Style>
                                        <Style TargetType="Grid">
                                            <Setter Property="Background" Value="Blue"></Setter>
                                        </Style>
                                    </Grid.Style>
                                    <ContentPresenter/>
                                </Grid>
                                <ControlTemplate.Triggers>
                                    <EventTrigger RoutedEvent="MouseEnter">
                                        <BeginStoryboard>
                                            <Storyboard>
                                                <ColorAnimation Storyboard.TargetName="MainGrid" Storyboard.TargetProperty="Background.Color" To="Pink" Duration="0:0:1" />
                                            </Storyboard>
                                        </BeginStoryboard>
                                    </EventTrigger>
                                </ControlTemplate.Triggers>
                            </ControlTemplate>
                        </Setter.Value>
                    </Setter>
                </Style.Setters>
            </Style>
        </GroupBox.Style>
        <Button Content="test" Width="200" Height="50"></Button>
    </GroupBox>

这样做之后,你就可以轻松使用Storyboard.TargetProperty="Background.Color"

【讨论】:

  • 是的,真的,我什至想过这个问题:ColorAnimation 怎么知道如何从未设置的颜色动画到粉红色?但是,我需要以通用方式执行此操作,即不为主布局网格设置预定义颜色。有没有办法实现这个?
  • 顺便说一句,即使是 Grid 节点中的简单属性设置也有帮助:&lt;Grid Background="Blue"&gt;
  • 您可以为网格定义默认背景。内置默认值应为透明或白色。只需重新设置它,您将拥有更通用的方法。
  • 不将背景设置为透明会改变控件中的鼠标行为吗?另请参阅SO discussion。有没有办法将背景从 Null 设置为指定颜色?
  • 并非如此。 what 您最初设置为背景并不重要,只要您设置了一个。 Wpf 在某些地方不是很漂亮,但我们必须处理它
猜你喜欢
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2011-01-15
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
相关资源
最近更新 更多