Я пытаюсь перенести шаблонный элемент вперед (ZIndex) в стековую панель с привязкой к данным.Поскольку панель стека создает ContentPresenter для каждого элемента в нем, мое визуальное дерево выглядит следующим образом:
ItemsControl
Border
ItemsPresenter
StackPanel
ContentPresenter
ToggleButton
ContentPresenter
ToggleButton
ContentPresenter
ToggleButton
При нажатии кнопки ToggleButton она запускает раскадровку следующим образом:
<Storyboard x:Key="MyStoryboard" >
<Int32AnimationUsingKeyFrames BeginTime="0:0:0.000" Duration="0:0:0.350"
Storyboard.TargetProperty="TemplatedParent.(Panel.ZIndex)" >
<Int32KeyFrameCollection>
<DiscreteInt32KeyFrame KeyTime="0:0:0.000" Value="99" />
</Int32KeyFrameCollection>
</Int32AnimationUsingKeyFrames>
</Storyboard>
<Style x:Key="SubStateOptionButtonStyle" TargetType="ToggleButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ToggleButton">
<!-- Toggle Button Contents here -->
<ControlTemplate.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard Storyboard="{StaticResource MyStoryboard}" />
</EventTrigger.Actions>
</EventTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Однако TemplatedParent. (Panel.ZIndex) дает мне странное исключение:
Значение не может быть нулевым.Имя параметра: dp
в System.Windows.DependencyObject.GetValue (DependencyProperty dp) в System.Windows.Media.Animation.Storyboard.ProcessComplexPath (HybridDictionary clockMappings, DependencyObject targetObject, анимация пути пути, свойство-путь-путь-обхода, блокировка по пути к себе, блокировка по пути объекта, блокировка объекта, анимация объекта)Слой Int64) в System.Windows.Media.Animation.Storyboard.ClockTreeWalkRecursive (Clock currentClock, DependencyObject, содержащийObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehaictionaryMackingMapDefenderMeditionMunctionWid.Animation.Storyboard.ClockTreeWalkRecursive (Clock currentClock, DependencyObject, содержащийObject, INameScope nameScope, DependencyObject parentObject, String parentObjectName, PropertyPath parentPropertyPath, HandoffBehavior handoffBehavior.mocketMeditionSystemWindows.Info.Control.Amp32.Amp32.Amp32.Chint.Windows.Mision.Amp32.AmpMate.SystemMed.SystemBectionSecate.SystemBeginS.SystemBeginS.ShellMed.Wision.Sec .Med.Sec .Med.SystemMed.Wision.Sec .Med.SystemMed.Sec .Med.Sec... .MBe .Sec.......... Понадобится...n (DependencyObject, содержащийObject, INameScope nameScope, HandoffBehavior handoffBehavior, Boolean isControllable, слой Int64) в System.Windows.Media.Animation.BeginStoryboard.Begin (DependencyObject targetObject, IName
1011
1012 *1013* * * 1022) *
Я дважды проверил через code-behind, что TemplatedParent элемента ToggleButton действительно является ContentPresenter, и я могу установить ZIndex примерно так:
Panel.SetZIndex((sender as ToggleButton).TemplatedParent as UIElement, 99);
Но я бы хотел оживить его с помощьюРаскадровка, желательно с прямым XAML, поскольку она должна оставаться впереди на протяжении всей раскадровки, а затем вернуться туда, где она была.
Я рассмотрел наследование от ItemsControl, чтобы предотвратить создание ContentPresenter, но этожесткое решение чего-то, что кажется легким.