Проблема с EventTrigger для определенного элемента пользовательского интерфейса - PullRequest
0 голосов
/ 07 июля 2011

У меня проблема при использовании EventTriggers. У меня есть две кнопки и два EventTriggers, которые я хочу прослушивать на события Click от этих кнопок, затем триггеры должны запустить StoryBoard, которая анимирует высоту элемента управления.
У меня нет проблем с запуском StoryBoards, у меня просто проблема с указанием SourceName EventTrigger:

<UserControl x:Class="MyWindow"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             >

    <UserControl.Resources>
        <Storyboard x:Key="GrowPanel1">
            <DoubleAnimation To="400" Duration="0:0:0.75" Storyboard.TargetName="Panel1" Storyboard.TargetProperty="Height" />
        </Storyboard>
        <Storyboard x:Key="GrowPanel2">
            <DoubleAnimation To="400" Duration="0:0:0.75" Storyboard.TargetName="Panel2" Storyboard.TargetProperty="Height" />
        </Storyboard>
    </UserControl.Resources>

    <Grid >
        <Grid.Triggers>
            <EventTrigger RoutedEvent="Button.Click" SourceName="TriggerElement1" >
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource GrowPanel1}"  />
                </EventTrigger.Actions>
            </EventTrigger>
            <EventTrigger RoutedEvent="Button.Click"  SourceName="TriggerElement2" >
                <EventTrigger.Actions>
                    <BeginStoryboard Storyboard="{StaticResource GrowPanel2}"  />
                </EventTrigger.Actions>
            </EventTrigger>
        </Grid.Triggers>
        <Border BorderBrush="HotPink" BorderThickness="2">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>


                <ContentPresenter Panel.ZIndex="20" Grid.Column="1" >
                    <ContentPresenter.Content>
                        <StackPanel Orientation="Horizontal">
                            <Button x:Name="TriggerElement2" Background="BurlyWood"  Width="30" Height="30" VerticalAlignment="Top" />
                            <Button x:Name="TriggerElement1" Background="Chartreuse"  Width="30" Height="30" VerticalAlignment="Top" />
                        </StackPanel>
                    </ContentPresenter.Content>
                </ContentPresenter>

                <Grid Grid.Column="0" Grid.ColumnSpan="2">
                    <my1:TreeViewNav Name="Panel1" Height="0" VerticalAlignment="Top" />
                    <my:ListViewNav x:Name="Panel2" Height="0" VerticalAlignment="Top" />
                </Grid>
            </Grid>
        </Border>
    </Grid>
</UserControl>

При этом я получаю ошибку времени выполнения:

Наиболее вероятное исключение было: «System.Windows.Markup.XamlParseException:« Инициализация «System.Windows.Controls.Grid» вызвала исключение ». Номер строки «23» и позиция «6». ---> System.ArgumentException: не удается найти FrameworkElement с именем «TriggerElement1». в System.Windows.FrameworkElement.FindNamedFrameworkElement (FrameworkElement startElement, String targetName) в System.Windows.EventTrigger.ProcessOneTrigger (FrameworkElement triggersHost, TriggerBase triggerBase) в System.Windows.EventTrigger.ProcessTriggerCollection (FrameworkElement triggersHost) в System.Windows.FrameworkElement.TryFireInitialized () в System.Windows.FrameworkElement.EndInit () в MS.Internal.Xaml.Runtime.ClrObjectRuntime.InitializationGuard (XamlType xamlType, Object obj, Boolean начало) --- Конец внутренней трассировки стека исключений ---

Удаление свойства EventTrigger SourceName исправляет ошибку, но мне нужно запускать разные StoryBoards в зависимости от того, какая кнопка нажата. Так что, насколько я знаю, мне нужно использовать SourceName.

Почему WPF не может найти мою кнопку с именем TriggerElement1? Я думал, что RoutedEvents запутаются в визуальном дереве, поэтому, пока триггер находится на достаточно высоком уровне, у него не должно быть проблем с именами? У него нет проблем с поиском StoryBoard.Target под названием Panel1. Правильно ли я выбрал две кнопки для запуска разных раскадровок?

1 Ответ

0 голосов
/ 07 июля 2011

Поскольку ваша кнопка «TriggerElement1» находится внутри, приложение ContentPresenter не может найти кнопку при инициализации.Поскольку контент contentpresentor будет отображаться во время выполнения.

Я внес несколько изменений в ваш код, который теперь работает нормально ... надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...