У меня проблема при использовании 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. Правильно ли я выбрал две кнопки для запуска разных раскадровок?