DataGridRow的WPF动画背景颜色从透明到“当前”(当前用Trigger设置)

时间:2013-08-24 10:50:34

标签: wpf

我将DataGridRow BackgroundColor设置为绿色或红色,触发基于LogError值。

我想用透明度动画新添加的行。

这很好用:

From="Transparent" To="Red"

但我想要的颜色是当前用Style设置的颜色。它并不总是红色,也可能是绿色。

这不起作用:

From="Transparent" To="{TemplateBinding DataGridRow.Background}"

From="Transparent" To="{Binding RelativeSource={RelativeSource Self}, Path=Backgound}"

代码:

<DataGrid.Resources>
  <Style TargetType="{x:Type DataGridRow}">
    <Setter Property = "Background" Value="LimeGreen"/>
    <Style.Triggers>
      <DataTrigger Binding="{Binding LogMessage}" Value="Exception has occured">
        <Setter Property = "Background" Value="Red"/>
      </DataTrigger>
    </Style.Triggers>
  </Style>
</DataGrid.Resources>          
<DataGrid.RowStyle>
  <Style TargetType="DataGridRow">
    <Style.Triggers>
      <EventTrigger RoutedEvent="Loaded">
        <BeginStoryboard>
          <Storyboard>
            <ColorAnimation
                Storyboard.TargetProperty="(DataGridRow.Background).(SolidColorBrush.Color)" 
                Duration="00:00:03" 
                From="Transparent"
                To="{TemplateBinding DataGridRow.Background}"/>
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </Style.Triggers>
  </Style>
</DataGrid.RowStyle>

错误讯息:Cannot freeze this Storyboard timeline tree for use across threads.

2 个答案:

答案 0 :(得分:3)

您的XAML代码中存在一些问题。

首先,您已在DataGrid的资源部分下指定了默认样式,稍后会提供您自己的样式,该样式将覆盖默认样式。 您应该定义新样式并将其BasedOn DP设置为引用默认样式。但在你的情况下,我没有看到any use of defining separate style just for trigger

第二次,您希望动画从Transparent变为颜色选择的颜色,可以通过LimeGreen或Red取决于触发器。因此,您不应在动画中设置To值,因为它会自动拾取。

这将按您的意愿运作 -

   <DataGrid>
      <DataGrid.Resources>
          <Style TargetType="{x:Type DataGridRow}">
              <Setter Property ="Background" Value="LimeGreen"/>
              <Style.Triggers>
                 <DataTrigger Binding="{Binding LogMessage}"
                                        Value="Exception has occured">
                     <Setter Property = "Background" Value="Red"/>
                 </DataTrigger>
                 <EventTrigger RoutedEvent="Loaded">
                     <BeginStoryboard>
                         <Storyboard>
                             <ColorAnimation Storyboard.TargetProperty=
                              "(DataGridRow.Background).(SolidColorBrush.Color)" 
                                             Duration="00:00:03" 
                                             From="Transparent"/>
                         </Storyboard>
                     </BeginStoryboard>
                 </EventTrigger>
               </Style.Triggers>
            </Style>
        </DataGrid.Resources>
   </DataGrid>

答案 1 :(得分:1)

@Den 在制作动画之前,您必须确定标准颜色。这是我用于为行和单元格设置动画的样式。

            <Style TargetType="{x:Type DataGridRow}">
            <Style.Setters>
                <Setter Property="BorderThickness" Value="1"/>
                <Setter Property="Background" Value="Transparent"/>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderBrush" Value="#FFF37C21"/>
                </Trigger>
                <Trigger Property="IsSelected" Value="True">
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="(DataGridRow.Background).(SolidColorBrush.Color)" Duration="00:00:0.2" To="#FFF37C21"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ColorAnimation Storyboard.TargetProperty="(DataGridRow.Background).(SolidColorBrush.Color)" Duration="00:00:0.2" To="Transparent"/>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>


            <Style TargetType="{x:Type DataGridCell}">
            <Style.Setters>
                <Setter Property="FontWeight" Value="Light"/>
                <Setter Property="BorderThickness" Value="0"/>
                <Setter Property="IsTabStop" Value="False" />
                <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridCell}">
                            <Grid x:Name="gridCell" Background="#00FFFFFF">
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="3"/>
                                    <ColumnDefinition Width="*"/>
                                </Grid.ColumnDefinitions>

                                <Grid.RowDefinitions>
                                    <RowDefinition Height="30"/>
                                </Grid.RowDefinitions>

                                <ContentPresenter 
                                        Grid.Column="1" 
                                        HorizontalAlignment="Left" 
                                        VerticalAlignment="Center"/>
                            </Grid>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
            <Style.Triggers>
                <Trigger Property="IsSelected" Value="True">
                    <Setter Property="Foreground" Value="Black"/>
                    <Trigger.EnterActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.FontWeight)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:0.2">
                                        <DiscreteObjectKeyFrame.Value>
                                            <FontWeight>Bold</FontWeight>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.EnterActions>
                    <Trigger.ExitActions>
                        <BeginStoryboard>
                            <Storyboard>
                                <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(TextElement.FontWeight)">
                                    <DiscreteObjectKeyFrame KeyTime="00:00:0.2">
                                        <DiscreteObjectKeyFrame.Value>
                                            <FontWeight>Light</FontWeight>
                                        </DiscreteObjectKeyFrame.Value>
                                    </DiscreteObjectKeyFrame>
                                </ObjectAnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </Trigger.ExitActions>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Style.Resources>
</Style>