我有一个自定义Panel
,它引发了一个RoutedEvent
在静态类中全局定义的:
public class CompressItemsToFitStackPanel : StackPanel
{
protected override Size ArrangeOverride(Size arrangeSize)
{
// some logic
// Raise Attached Event
CustomEventManager.RaiseArrangeEvent(this);
return base.ArrangeOverride(arrangeSize);
}
}
我的附件Event
:
public static class CustomEventManager
{
public static readonly RoutedEvent ArrangeEvent = EventManager.RegisterRoutedEvent("Arrange",
RoutingStrategy.Bubble,
typeof(RoutedEventHandler),
typeof(CustomEventManager));
internal static void RaiseArrangeEvent(UIElement target)
{
var args = new RoutedEventArgs(ArrangeEvent);
target.RaiseEvent(args);
}
}
此面板是项目控件的项目面板,作为 EventTrigger 的 ItemsTemplate 在引发附加事件时我不想触发:
<DataTemplate DataType="{x:Type local:Checker}" x:Key="CheckerTempalte">
<Ellipse x:Name="ellipse" Style="{StaticResource checkerStyle}">
<Ellipse.Triggers>
<EventTrigger RoutedEvent="local:CustomEventManager.Arrange">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames
Storyboard.TargetProperty="(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)"
Storyboard.TargetName="ellipse"
>
<EasingDoubleKeyFrame KeyTime="0:0:0" Value="0" />
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="{Binding Val}" />
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Ellipse.Triggers>
</Ellipse>
事件触发器未触发,
也许我没有正确使用 AttachedEvents 或者它没有正确声明我需要面板中的事件来传播并触发子元素中的 EventTriggers,
任何想法我做错了什么?
编辑 :
在 dkozl 的洞察力之后,我得出结论,我需要一个 AddXXXHandler 和 RemoveXXXHandler 以便 XAML 添加/删除 EventTrigger 的处理程序
public static void AddArrangeHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie != null)
{
uie.AddHandler(CustomEventManager.ArrangeEvent, handler);
}
}
public static void RemoveArrangeHandler(DependencyObject d, RoutedEventHandler handler)
{
UIElement uie = d as UIElement;
if (uie != null)
{
uie.RemoveHandler(CustomEventManager.ArrangeEvent, handler);
}
}
但仍然没有任何反应,我从来没有达到这些方法。
编辑 2:
感谢 dkozl 在下面的评论,
为每个子元素引发事件,因为省略号位于 Visual Tree 的下方。
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in children)
{
CustomEventManager.RaiseArrangeEvent(child);
}
}
但仍然没有任何反应,我还通过为“EventTrigger”提供“MouseEnter”事件并将鼠标移到元素上来测试“StoryBoard”,它工作正常。
尽管如此,即使在每个 Ellipse 上引发事件仍然不起作用......有什么想法吗?
另一个有趣的地方是子元素实际上是“Checker”类型,而不是 DataTemplate 代表的 Ellipse,我不明白“Checker”是如何被视为 UIElement 的。?