【发布时间】:2013-05-20 09:12:47
【问题描述】:
我有一个自定义的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);
}
}
此面板是项目控件的项目面板, 将 ItemsTemplate 作为 EventTrigger,在引发附加事件时我不想触发:
<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的cmets,
为每个子元素引发事件,因为椭圆在 视觉树。
protected override Size ArrangeOverride(Size arrangeSize)
{
foreach (UIElement child in children)
{
CustomEventManager.RaiseArrangeEvent(child);
}
}
但仍然没有任何反应,iv'e 还通过提供“EventTrigger”测试了“StoryBoard” 'MouseEnter' 事件并将我的鼠标移到元素上,它工作正常。
不过,即使在每个 Ellipse 上引发事件仍然不起作用...... 有任何想法吗 ?
另一个有趣的地方是子元素实际上是'Checker'类型 而不是 DataTemplate 代表的椭圆,我不明白“Checker”是如何被视为 UIElement 的。?
【问题讨论】:
标签: wpf eventtrigger routed-events