Анимация Silverlight: не удается разрешить TargetName - PullRequest
1 голос
/ 13 ноября 2011

У меня проблемы с анимацией.Сначала я попробовал анимировать, используя VisualStateManager из разметки XAML.Это сработало при попытке анимировать свойство Opacity, но не свойство Height.Тогда я решил попробовать сделать это с помощью программной анимации, чтобы мне было легче отлаживать.Соответственно, я продолжал получать следующее:

Не удается разрешить TargetName ExplorerBody

Я не знаю, почему работает анимация прозрачности, но не высота, и я не знаю, почему она не можетразрешить TargetName.Извлеките мой код, возможно, вы увидите то, что я не смог:

    <ControlTemplate TargetType="Controls:ApplicationExplorer">                        
        <Border BorderBrush="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderBrush}" 
                BorderThickness="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=BorderThickness}" 
                CornerRadius="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=CornerRadius}" 
                Width="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Width}" 
                Height="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Height}" >

            <Grid x:Name="Root" MinWidth="100">
                <Grid.RowDefinitions>
                    <RowDefinition Height="30" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <Grid Grid.Row="0" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HeaderBackgroundBrush}">
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="10" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="40" />
                    </Grid.ColumnDefinitions>
                    <TextBlock Grid.Column="1" Text="{TemplateBinding Title}" Style="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TitleStyle}" VerticalAlignment="Center" />
                    <Controls:LayoutToggleButton Grid.Column="2" x:Name="LayoutButton" Cursor="Hand" />
                </Grid>
                <Border x:Name="ExplorerBody" Background="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Background}" 
                        Grid.Row="1" HorizontalAlignment="Stretch" BorderThickness="0" >
                    <toolkit:TreeViewDragDropTarget AllowedSourceEffects="Copy" x:Name="treeViewDropTarget" 
                                            HorizontalAlignment="Left" VerticalAlignment="Top" >
                        <sdk:TreeView x:Name="treeView" ItemsSource="{TemplateBinding Nodes}" Background="Transparent" BorderThickness="0"
                            ItemTemplate="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=TreeItemTemplate}" 
                            HorizontalAlignment="Left" Margin="10 0 0 0" />
                    </toolkit:TreeViewDragDropTarget>
                </Border>
            </Grid>
            <vsm:VisualStateManager.VisualStateGroups>
                <vsm:VisualStateGroup x:Name="LayoutGroup">
                    <vsm:VisualState x:Name="Minimized">
                        <Storyboard>
                            <DoubleAnimation Storyboard.TargetName="ExplorerBody" Storyboard.TargetProperty="Height" Duration="0:0:0.5" From="1"  To="0" />
                        </Storyboard>
                    </vsm:VisualState>
                    <vsm:VisualState x:Name="Maximized" />
                </vsm:VisualStateGroup>
            </vsm:VisualStateManager.VisualStateGroups>
        </Border>
    </ControlTemplate>

И вот как я пытался это сделать, используя код C #:

    Storyboard storyboard = new Storyboard();
    storyboard.SetValue(Storyboard.TargetNameProperty, _explorerBody.Name);
    storyboard.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("Opacity"));
    DoubleAnimation anim = new DoubleAnimation();
    anim.Duration = new Duration(new TimeSpan(0, 0, 0, 0, 500));
    anim.To = 0;
    storyboard.Children.Add(anim);
    storyboard.Begin();

Так что же не так смой код?

Ответы [ 3 ]

1 голос
/ 10 февраля 2012

Ваша первоначальная попытка соответствует документации MS -

Storyboard storyboard = new Storyboard();

storyboard.SetValue(Storyboard.TargetNameProperty, _explorerBody.Name);

storyboard.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("Opacity"));
DoubleAnimation anim = new DoubleAnimation();

и ваше решение -

    Storyboard storyboard = new Storyboard();
    storyboard.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("Opacity"));
    DoubleAnimation animation = new DoubleAnimation();
    storyboard.Children.Add(animation);
    Storyboard.SetTarget(animation, _explorerBody);

В частности, замена -

  storyboard.SetValue(Storyboard.TargetNameProperty part with -
  Storyboard.SetTarget(animation, _explorerBody);

это то, что взломает его.

0 голосов
/ 13 ноября 2011

Хорошо, я наконец-то начал работать ... Следующая ссылка была полезна:

http://mindfusion.eu/Forum/YaBB.pl?board=diaglite_disc;action=display;num=1278055916

Вот мой код на случай, если кому-то понадобится:

    private void SwitchLayoutState(object sender, RoutedEventArgs e)
    {
        if (_currentState == ControlLayout.None)
        {
            throw new ArgumentException("Control layout cannot be None.");
        }

        Duration duration = new Duration(new TimeSpan(0, 0, 0, 0, 400));
        Storyboard storyboard = new Storyboard();
        storyboard.SetValue(Storyboard.TargetPropertyProperty, new PropertyPath("Opacity"));
        DoubleAnimation animation = new DoubleAnimation();
        storyboard.Children.Add(animation);
        Storyboard.SetTarget(animation, _explorerBody);

        if (_currentState == ControlLayout.Maximized)
        {
            animation.To = 0;

            storyboard.Completed += (s, args) => { _explorerBody.Visibility = System.Windows.Visibility.Collapsed; };
            storyboard.Begin();

            _currentState = ControlLayout.Minimized;
            _layoutButton.Content = "+";
        }
        else if (_currentState == ControlLayout.Minimized)
        {
            _explorerBody.Visibility = System.Windows.Visibility.Visible;

            animation.To = 1;
            storyboard.Begin();

            _currentState = ControlLayout.Maximized;
            _layoutButton.Content = "-";
        }
    }
0 голосов
/ 13 ноября 2011

Не уверен насчет ошибки TargetName, но я вполне уверен, что вам нужно что-то вроде (UIElement.Height) для TargetProperty.
Не могу сейчас попытаться воспроизвести вашу проблему, так что просто дикая догадка...

<DoubleAnimation Storyboard.TargetName="ExplorerBody" Storyboard.TargetProperty="(UIElement.Height)" Duration="0:0:0.5" From="1"  To="0" />
...