6 Stimmen

Die WPF-Animation löst die Exception "'Background' property does not point to a DependencyObject in path '(0).(1)'" aus.

Ich habe einige WPF-Quellen:

<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>

Ich fülle die Liste mit:

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_;
}

Das Problem ist, dass ich eine Ausnahme bekomme Die Eigenschaft 'Background' verweist nicht auf ein DependencyObject im Pfad '(0).(1)'. Ich weiß nicht, warum :-( Weiß das jemand?

Danke Grüße Michael

9voto

RJ Lohan Punkte 6407

Diese Ausnahme wird ausgelöst, wenn zu Beginn der Animation keine Hintergrund-Eigenschaft für den TextBlock festgelegt ist. Die Ein-Zeilen-Lösung besteht darin, sicherzustellen, dass Sie einen anfänglichen Hintergrund im TextBlock zu Beginn festlegen, und dies über {DynamicResource} garantiert das nicht für Sie.

5voto

Mario Pistrich Punkte 488

Gibt es einen bestimmten Grund, warum Sie die DynamicResource anstelle von StaticResource ? Soweit ich weiß, sollten Sie nur DynamicResource wenn der Stil dynamisch aktualisiert wird.

Wenn ich die DynamicResource en StaticResource funktioniert der Code bei mir.

Edit: Hier ist der Code, der bei mir funktioniert hat:

<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>

Und mein 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_;
    }
}

0voto

Nalin Jayasuriya Punkte 109

Hier ist ein Beispiel, das Ihnen helfen könnte:

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" />

Wenn Sie die Animation von C# aus starten ...

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X