未调用WPF有线事件处理程序

时间:2011-10-11 15:24:30

标签: wpf visual-studio-2008 user-controls .net-3.5

第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的无线( - =)。还有什么可以检查以发现这些行为不同的原因?

2 个答案:

答案 0 :(得分:1)

感谢Rachel让我想起这件事,我意识到我已经遗漏了

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

在我继承的课程中。 (作为一个事件,它不会继承。)这解决了我的问题,虽然我仍然想知道它是如何起作用的。

答案 1 :(得分:0)

我知道这并不能帮助你理解如何做你所要求的事情,但无论如何我都有一个建议,以防这是一个XYZ问题。

仅仅通过查看您正在做的事情,即使用或多或少的Button自定义实现来切换布尔值,我建议使用ToggleButton代替。这将是一种更为WPF的方式。

这样状态在UI中是清楚的,你不必连接逻辑,为你处理切换,你可以绑定到IsChecked值!

无论如何,我的两分钱值得。