2011-10-11 38 views
0

第2天,我没有线索。 [净3.5,VS 2008]WPF有线事件处理程序不叫

我有一个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 ,它击中。在可衡量的按钮的情况下,RaiseEvent进入measurableButton_Click;在BuyoutButton的情况下,RaiseEvent不会去BuyoutButton_Click。

在应用程序中没有任何BuyoutButton.Click的未布线( - =)。我还需要进一步检查以发现这些行为差异的原因?

+0

我在按钮中看到的唯一区别是有'x:FieldModifier',另一个没有。如果你删除它,它会工作吗?另外,如果您切换按钮位置,它的工作原理是否相反?我看不到完整的UserControl代码,但可能在设置第二个事件时覆盖ClickEvent,而不是创建事件的新实例。 – Rachel

+0

删除'x:FieldModifier'不会改变行为。我无法切换按钮位置,它们位于两个完全不同的窗口中。是否有可能用'Click =“method”'语法覆盖ClickEvent? (我是WPF的新手,但不是这些仍然是多播代表?) –

+0

我的UserControl是从另一个派生;基类定义了“公共事件RoutedEventHandler Click”。我没有意识到我必须在派生类中具有完全相同的代码(为什么它不会继承?),但是当我将事件添加到派生类时,我的问题就解决了。 –

回答

1

与感谢雷切尔让我想想时,我才意识到我已经在我的继承类冷落

public event RoutedEventHandler Click 
{ 
    add { AddHandler (ClickEvent, value); } 
    remove { RemoveHandler (ClickEvent, value); } 
} 

。 (作为一个事件,它不会继承。)这解决了我的问题,但我仍然想知道它是如何工作的。

0

我知道这并不能帮助您了解如何处理您所问的问题,但无论如何我都会有一个建议,以防万一这会成为XYZ问题。

只要看看你在做什么,这是用一个或多或少的自定义按钮实现切换布尔值,我会建议使用ToggleButton来代替。这将是一个更WPF的方式来做到这一点。

通过这种方式,状态在用户界面中很清晰,您不必挂钩逻辑,就可以为您处理切换,并且您可以绑定到IsChecked值!不管怎么说,我的两美分的价值。