【问题标题】:WPF Wired Event Handler is not called未调用 WPF 有线事件处理程序
【发布时间】: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


【解决方案1】:

我知道这并不能帮助您了解如何执行您所要求的操作,但无论如何我有一个建议,以防万一这是一个 XYZ 问题。

仅从查看您正在执行的操作(即使用或多或少的自定义按钮实现来切换布尔值)来看,我建议您改用 ToggleButton。这将是一种更符合 WPF 的方式。

这样状态在 UI 中就很清楚了,你不用去挂逻辑,切换为你处理,你可以绑定到IsChecked 值!

不管怎样,我的两美分值。

【讨论】:

    【解决方案2】:

    感谢 Rachel 让我想到了这个活动,我意识到我漏掉了

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 2018-07-13
      • 2011-02-02
      • 2014-11-24
      相关资源
      最近更新 更多