Как начать раскадровку на основе выбора ListBoxItem? - PullRequest
1 голос
/ 30 сентября 2010

Я столкнулся с проблемой, которую не могу решить. Я надеюсь найти ответ здесь. Мне нужен список, чтобы скрыть на полпути, когда выбран определенный элемент списка. Я установил раскадровку с анимацией маски непрозрачности, которая отлично работает в смеси. Моя проблема, я не могу инициировать BeginStoryboard. Я пробовал множество способов и безуспешно. Мне нужно скрыть список, чтобы раскрыть содержание, стоящее за ним. Я генерирую списки элементов из файла данных XML и на основе имени узла, который я планировал начать раскадровку.

Вот что у меня есть. Я создал DataTemplate, который я установил в ListBoxItem Style:

<DataTemplate x:Key="SelectedListBoxItemDataTemplate">
        <StackPanel x:Name="DataItemSelected" Orientation="Horizontal" Margin="12,0,0,0" >
                <TextBlock FontFamily="Arial" Text="►" VerticalAlignment="Center" HorizontalAlignment="Center" Visibility="{Binding XPath=state}" Margin="-4, 0,6,4"/>
                <Image x:Name="ListBoxImage" Source="{Binding XPath=icon}" Margin="4,4,14,4" VerticalAlignment="Center" HorizontalAlignment="Center" Stretch="Uniform" />
                <TextBlock x:Name="textBlock" Text="{Binding XPath=name}" LineHeight="22" Foreground="#FFFFFFFF" FontSize="16"  />  
                <Border x:Name="PART_Icon" Background="{x:Null}" Width="{Binding NodeValue.Width}" HorizontalAlignment="Left" Padding="3,0"></Border>
            </StackPanel>

        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding XPath=name}" Value="SERVERS">
                <Setter TargetName="PART_Icon" Property="Background" Value="Black" />
                <DataTrigger.EnterActions>
                    <BeginStoryboard Storyboard="{StaticResource HideListBox}" x:Name="HideListBox_BeginStoryboard"/>
                </DataTrigger.EnterActions>  
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate> 

Мне нужно запустить эту раскадровку, которую я храню в Window.Resources:

<Storyboard x:Key="HideListBox">
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].(GradientStop.Offset)" Storyboard.TargetName="Nav_ListBox">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.069"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].(GradientStop.Offset)" Storyboard.TargetName="Nav_ListBox">
            <EasingDoubleKeyFrame KeyTime="0" Value="0.069"/>
            <EasingDoubleKeyFrame KeyTime="0:0:0.4" Value="1"/>
        </DoubleAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName="Nav_ListBox">
            <EasingColorKeyFrame KeyTime="0" Value="White"/>
            <EasingColorKeyFrame KeyTime="0:0:0.4" Value="White"/>
        </ColorAnimationUsingKeyFrames>
        <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName="Nav_ListBox">
            <EasingColorKeyFrame KeyTime="0" Value="#00000000"/>
            <EasingColorKeyFrame KeyTime="0:0:0.4" Value="#00000000"/>
        </ColorAnimationUsingKeyFrames>
        <PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(LinearGradientBrush.StartPoint)" Storyboard.TargetName="Nav_ListBox">
            <EasingPointKeyFrame KeyTime="0" Value="1.076,0.501"/>
            <EasingPointKeyFrame KeyTime="0:0:0.4" Value="1,0.5"/>
        </PointAnimationUsingKeyFrames>
        <PointAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.OpacityMask).(LinearGradientBrush.EndPoint)" Storyboard.TargetName="Nav_ListBox">
            <EasingPointKeyFrame KeyTime="0" Value="0.035,0.501"/>
            <EasingPointKeyFrame KeyTime="0:0:0.4" Value="0.2,0.5"/>
        </PointAnimationUsingKeyFrames>
    </Storyboard>

Я получаю ошибки, что объект "Nav_ListBox" не может быть найден. Я понимаю, что объект списка не доступен с уровня таблицы данных. Мне интересно, каково будет правильное решение, позволяющее воспроизводить анимацию и, в конечном итоге, удалять по щелчку элемент списка. Заранее спасибо.

1 Ответ

1 голос
/ 30 сентября 2010

Я собрал что-то быстрое, чтобы, надеюсь, помочь вам на вашем пути (новое приложение WPF по умолчанию, DataContext MainWindow настроен на себя).Я закончил тем, что использовал IValueConverter, чтобы получить Имя из сгенерированного XmlLinkedNode из SelectedItem ListBox, но должен быть более элегантный способ использования операторов XPath, с которыми я не знаком.В основном объявляйте свою раскадровку в стиле ListBoxes, а не в шаблоне данных:

XAML:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WpfApplication1"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <XmlDataProvider x:Key="persons"
                         XPath="persons/person"
                         Source="xmldata.xml" />
        <local:SelectionConverter x:Key="selectionConverter" />
    </Window.Resources>

    <Grid>
        <ListBox Background="White" ItemsSource="{Binding Source={StaticResource persons}}" x:Name="lst">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <TextBlock Text="{Binding XPath=name}" />
                        <TextBlock Text="{Binding XPath=prop}" />
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
            <ListBox.Style>
                <Style>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=lst, Path=SelectedItem, Converter={StaticResource selectionConverter}}"
                                     Value="b">
                            <DataTrigger.EnterActions>
                                <BeginStoryboard>
                                    <Storyboard Duration="0:0:1">
                                        <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
                                                        To="Green" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.EnterActions>
                            <DataTrigger.ExitActions>
                                <BeginStoryboard>
                                    <Storyboard Duration="0:0:1">
                                        <ColorAnimation Storyboard.TargetProperty="(Background).(SolidColorBrush.Color)"
                                                        To="White" />
                                    </Storyboard>
                                </BeginStoryboard>
                            </DataTrigger.ExitActions>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ListBox.Style>
        </ListBox>
    </Grid>
</Window>

Код основного окна:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            this.DataContext = this;
        }
    }
}

SelectionConverter.cs

namespace WpfApplication1
{
    public class SelectionConverter : IValueConverter
    {
        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return (value == null) ? null : (value as XmlLinkedNode).SelectNodes("name")[0].InnerText;
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            throw new NotImplementedException();
        }

        #endregion
    }
}

Пример данных (Добавить в свой проект в виде XML-файла):

<?xml version="1.0" encoding="utf-8" ?>
<persons>
    <person>
        <name>a</name>
        <prop>3</prop>
    </person>
    <person>
        <name>b</name>
        <prop>3</prop>
    </person>
    <person>
        <name>c</name>
        <prop>3</prop>
    </person>
</persons>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...