将事件应用于所有类型的控件

时间:2016-01-14 14:13:20

标签: c# wpf

我在这里有两个关于wpf C#项目的问题。

  1. 这个片段在做什么? PreviewMouseMove += OnPreviewMouseMove;,如下面的代码所示。
  2. public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
    
            PreviewMouseMove += OnPreviewMouseMove;
            PreviewMouseLeftButtonUp += OnPreviewMouseUp;
            MouseLeave += OnMouseLeave;
        }
    
        private void OnMouseLeave(object sender, MouseEventArgs e)
        {
            spinnerControl.StopDragCapture(null);
        }
    
        private void OnPreviewMouseUp(object sender, MouseButtonEventArgs e)
        {
            spinnerControl.StopDragCapture(e);
        }
    
        private void OnPreviewMouseMove(object sender, MouseEventArgs e)
        {
    
            spinnerControl.UpdateOnDragMove(e);
        }
    }
    
    1. 这里的主要问题是,如何将所有这些MouseEvent实际应用于窗口中的每个类型控件?我已经把一个函数放在一起,在我的窗口中找到所有类型的控件,多亏了SO。我只是不清楚如何编写将事件分配给控件的实际函数。
    2. public partial class MainWindow : Window
      {
          // Enumerate all the descendants of the visual object.
          public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
          {
              if (depObj != null)
              {
                  for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
                  {
                      DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
                      if (child != null && child is T)
                      {
                          yield return (T)child;
                      }
      
                      foreach (T childOfChild in FindVisualChildren<T>(child))
                      {
                          yield return childOfChild;
                      }
                  }
              }
          }
      
          private void InitNumericSpinners()
          {
              foreach (NumericSpinnerControl spinner in FindVisualChildren<NumericSpinnerControl>(this))
              {
                  // do something here
                  // spinner (add OnMouseLeave event)
                  // spinner (add OnPreviewMouseUp event)
                  // spinner (add OnPreviewMouseMove event)
              }
          }
      
          private void Window_Loaded(object sender, RoutedEventArgs e)
          {
              InitNumericSpinners();
          }
      }
      

1 个答案:

答案 0 :(得分:1)

  

这段代码在做什么?

窗口分配处理程序PreviewMouseMove事件

  

如何将所有这些MouseEvent实际应用于窗口中的每个类型控件?

您已经知道如何查找所有控件 - 所以只需循环并分配处理程序:

    foreach (NumericSpinnerControl spinner in FindVisualChildren<NumericSpinnerControl>(this))
    {
        // do something here
        spinner.MouseLeave = OnMouseLeave;
        spinner.PreviewMouseUp = OnPreviewMouseUp;
        spinner.PreviewMouseMove = OnPreviewMouseMove;
    }

请注意,您可能希望将事件处理程序中的spinnerControl更改为sender,以便影响启动事件的控件,而不是引用特定控件。