【问题标题】:WPF animation throws Exception "'Background' property does not point to a DependencyObject in path '(0).(1)'."WPF 动画抛出异常“'Background' 属性未指向路径 '(0).(1)' 中的 DependencyObject。”
【发布时间】:2010-09-09 15:50:11
【问题描述】:

我有一些 WPF 源代码:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">

<Window.Resources>
    <SolidColorBrush x:Key="RedBrush" Color="Red"/>
    <SolidColorBrush x:Key="GreenBrush" Color="Green"/>
    <SolidColorBrush x:Key="TransparentBrush" Color="Transparent"/>

    <DataTemplate x:Key="MyItemTemplate">
        <Grid Margin="5">
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
            </Grid.ColumnDefinitions>

            <TextBlock Background="{DynamicResource TransparentBrush}">
                <TextBlock.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding State}" Value="Stat1">
                                <Setter Property="TextBlock.Background" Value="{DynamicResource RedBrush}" />
                            </DataTrigger>
                            <DataTrigger Binding="{Binding State}" Value="Stat2">                                    
                                <DataTrigger.EnterActions>
                                    <BeginStoryboard>
                                        <Storyboard RepeatBehavior="Forever">
                                            <ColorAnimation
                                                Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"
                                                Duration="00:00:01"
                                                From="Yellow" To="Red"/>
                                        </Storyboard>
                                    </BeginStoryboard>
                                </DataTrigger.EnterActions>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </TextBlock.Style>
                <TextBlock.Text>
                    <Binding Path="Name" />
                </TextBlock.Text>
            </TextBlock>
        </Grid>
    </DataTemplate>
</Window.Resources>

<ListBox x:Name="SomeList"
         HorizontalContentAlignment="Stretch"
         VerticalContentAlignment="Top"
         ScrollViewer.HorizontalScrollBarVisibility="Disabled"
         ScrollViewer.VerticalScrollBarVisibility="Visible"              
         ItemTemplate="{StaticResource MyItemTemplate}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="3" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

我在列表中填写:

public MainWindow()
{
    InitializeComponent();

    myList_ = new List<Foo>();

    myList_.Add(new Foo() { State = "Stat1", Name = "Name 1" });
    myList_.Add(new Foo() { State = "Stat2", Name = "Name 2" });

    SomeList.ItemsSource = myList_;
}

问题是,我遇到了一个异常 “背景”属性未指向路径“(0).(1)”中的 DependencyObject。 我不知道为什么 :-(andybody 知道吗?

谢谢 问候 迈克尔

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    如果在动画开始时 TextBlock 上没有设置 Background 属性,则会引发此异常。单线解决方案是确保您在 TextBlock 中设置初始背景,并且通过 {DynamicResource} 执行此操作并不能保证您这样做。

    【讨论】:

      【解决方案2】:

      您使用DynamicResource 而不是StaticResource 有什么具体原因吗?据我所知,您应该只在样式动态更新时使用DynamicResource

      如果我在StaticResource 中更改DynamicResource,代码对我有效。

      编辑:这是对我有用的代码:

      <Window x:Class="BackgroundTest.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      Title="MainWindow" Height="350" Width="525">
      
      <Window.Resources>
          <SolidColorBrush x:Key="RedBrush" Color="Red"/>
          <SolidColorBrush x:Key="GreenBrush" Color="Green"/>
          <SolidColorBrush x:Key="TransparentBrush" Color="Transparent"/>
      
          <DataTemplate x:Key="MyItemTemplate">
              <Grid Margin="5">
                  <Grid.ColumnDefinitions>
                      <ColumnDefinition />
                  </Grid.ColumnDefinitions>
      
                  <TextBlock Background="{StaticResource TransparentBrush}">
                  <TextBlock.Style>
                      <Style>
                          <Style.Triggers>
                              <DataTrigger Binding="{Binding State}" Value="Stat1">
                                  <Setter Property="TextBlock.Background" Value="{StaticResource RedBrush}" />
                              </DataTrigger>
                              <DataTrigger Binding="{Binding State}" Value="Stat2">                                    
                                  <DataTrigger.EnterActions>
                                      <BeginStoryboard>
                                          <Storyboard RepeatBehavior="Forever">
                                              <ColorAnimation
                                                  Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"
                                                  Duration="00:00:01"
                                                  From="Yellow" To="Red"/>
                                          </Storyboard>
                                      </BeginStoryboard>
                                  </DataTrigger.EnterActions>
                              </DataTrigger>
                          </Style.Triggers>
                      </Style>
                  </TextBlock.Style>
                  <TextBlock.Text>
                      <Binding Path="Name" />
                  </TextBlock.Text>
                  </TextBlock>
              </Grid>
          </DataTemplate>
      </Window.Resources>
      
      <ListBox x:Name="SomeList"
           HorizontalContentAlignment="Stretch"
           VerticalContentAlignment="Top"
           ScrollViewer.HorizontalScrollBarVisibility="Disabled"
           ScrollViewer.VerticalScrollBarVisibility="Visible"              
           ItemTemplate="{StaticResource MyItemTemplate}">
          <ListBox.ItemsPanel>
              <ItemsPanelTemplate>
                  <UniformGrid Columns="3" />
              </ItemsPanelTemplate>
          </ListBox.ItemsPanel>
      </ListBox>
      

      还有我的MainWindow.xaml.cs

      public partial class MainWindow : Window
      {
          IList<Foo> myList_;
      
          public MainWindow()
          {
              InitializeComponent();
      
              myList_ = new List<Foo>();
      
              myList_.Add(new Foo() { State = "Stat1", Name = "Name 1" });
              myList_.Add(new Foo() { State = "Stat2", Name = "Name 2" });
      
              SomeList.ItemsSource = myList_;
          }
      }
      

      【讨论】:

      • 我尽一切努力让它运行 ;) 你能发布 XAML 源吗?我不能让它运行:-(谢谢
      • @Michael:我添加了对我有用的代码。希望您的代码可以正常工作。
      【解决方案3】:

      这是一个可以帮助您的工作示例:

      XAML:

          <Storyboard x:Key="UpdateDetectedStoryboard">
              <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(TextBlock.Background).(SolidColorBrush.Color)"
                                            Storyboard.TargetName="TextBlockUpdatesDetected">
                  <EasingColorKeyFrame KeyTime="0:0:1"
                                       Value="#f07FA7BA" />
              </ColorAnimationUsingKeyFrames>
          </Storyboard>
      
      
      
                      <TextBlock Name="TextBlockUpdatesDetected"                               
                                Text="{x:Static res:Resource1.UpdatesDetected}"
                                FontSize="10"
                                Background="#FFD42121" />
      

      如果您是从 C# 开始动画...

                      Storyboard animation = this.Resources["UpdateDetectedStoryboard"] as Storyboard;
                      animation.Begin();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 2014-05-04
        • 1970-01-01
        • 2013-06-28
        • 2012-05-31
        • 2018-03-20
        • 1970-01-01
        相关资源
        最近更新 更多