【问题标题】:SizeChanged event being fired recursively递归触发 SizeChanged 事件
【发布时间】:2023-03-19 08:39:01
【问题描述】:

我的一个窗口中有一个 SizeChanged 事件。其中一个用户控件 Width 的行为很有趣,因此我决定在 SizeChanged 事件中静态设置窗口的宽度。问题是,当我在 size changed 事件中设置窗口的大小时,它会触发另一个 size changed 事件!我希望用户能够调整窗口大小,然后只触发一次事件。我试过了:

e.Handled = true;

以及在窗口构造函数中添加事件处理程序,并在大小更改事件中将其删除。 (这使得它只能触发一次,并且在窗口的生命周期内永远不会再次触发)。有任何想法吗?

【问题讨论】:

    标签: c# wpf events


    【解决方案1】:

    您应该使用私有布尔值并在大小更改时更改其值

    bool _sizeChanged=false;
    void handleResize(Object sender, EventArgs e)
    {
      if (_sizeChanged==false)
      {
        // do stuff
      }
       _sizeChanged=true;
    }
    

    但还不够,因为您应该在其他地方再次更改它的值。如果您不更改其值(例如在其他地方更改为 false),它将永远不会再次通过“if”条件。所以问题是,你应该在哪里改变它的值。

    我认为您可以更改 MouseButtonUp 事件的值,因为调整大小是通过鼠标完成的。

    【讨论】:

      【解决方案2】:

      您可以使用boolean 来确定是否处理您的事件。

      private bool m_handleResizeEvent;
      private void HandleResize(object sender, EventArgs e)
      {
          if (m_handleResizeEvent)
          {
               m_handleResizeEvent = false;
               // perform your resize here
               m_handleResizeEvent = true;
          }
      }
      

      【讨论】:

        【解决方案3】:

        原来是我的 Window 的 XAML 中的 SizeToContent="Width" 属性导致 SizeChanged 被多次调用。删除此属性解决了我的问题,并允许我调整窗口大小而无需多次触发事件。感谢其他所有人的回答和意见!

        【讨论】:

        • 不错的调试,你应该接受答案,这样你的比率就不会下降。
        • 我会在 StackOverflow 让我两天后! :) 哈哈
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-13
        • 2011-04-04
        • 2011-04-26
        • 1970-01-01
        相关资源
        最近更新 更多