【发布时间】:2023-03-11 06:11:02
【问题描述】:
第 2 天,我没有任何线索。 [.Net 3.5,VS 2008]
我有一个UserControl,它定义了一个ClickEvent:
public static readonly RoutedEvent ClickEvent = EventManager.RegisterRoutedEvent (
"Click", RoutingStrategy.Bubble, typeof ( RoutedEventHandler ), typeof ( TouchToggleButton ) );
还有一个OnClick 方法:
protected virtual void OnClick ( )
{
RaiseEvent ( new RoutedEventArgs { RoutedEvent = ClickEvent, Source = this } );
}
在两个不同的窗口中,我将这个控件的一个实例连接到一个事件处理程序。
<wft:TouchToggleButton DockPanel.Dock="Top" x:Name="measurableButton" Click="measurableButton_Click">Cannot Measure</wft:TouchToggleButton>
和
<wft:TouchToggleButton x:FieldModifier="public" x:Name="BuyoutButton" Click="BuyoutButton_Click">Buyout</wft:TouchToggleButton>
最后,我定义了两个处理程序:
private void measurableButton_Click ( object sender, RoutedEventArgs e )
{
IsMeasurable = !IsMeasurable;
OnMeasurableButtonChanged ( );
}
和
private void BuyoutButton_Click ( object sender, RoutedEventArgs e )
{
IsBuyout = !IsBuyout;
OnBuyoutButtonChanged ( );
}
在这两种情况下,如果我在OnClick 处设置一个断点,它就会命中。在 measurableButton 的情况下,RaiseEvent 转到 measurableButton_Click;在 BuyoutButton 的情况下,RaiseEvent 不会转到 BuyoutButton_Click。
应用程序中没有任何地方可以取消绑定 (-=) BuyoutButton.Click。我可以进一步检查什么来发现这些行为差异的原因?
【问题讨论】:
-
我在按钮中看到的唯一区别是一个有
x:FieldModifier而另一个没有。如果删除它会起作用吗?另外,如果您切换按钮位置,它是否会相反?我看不到您的完整 UserControl 代码,但您可能在设置第二个事件时覆盖了 ClickEvent,而不是创建事件的新实例。 -
删除
x:FieldModifier不会改变行为。我无法切换按钮位置,它们位于两个完全不同的窗口中。甚至可以用Click="method"语法覆盖 ClickEvent 吗? (我是 WPF 新手,但这些不是多播委托吗?) -
我的 UserControl 是从另一个派生而来的;基类定义了
public event RoutedEventHandler Click。我没有意识到我必须在派生类中有完全相同的代码(为什么不继承?),但是当我将事件添加到派生类时,我的问题就解决了。
标签: wpf visual-studio-2008 user-controls .net-3.5