【问题标题】:Global event handler全局事件处理程序
【发布时间】:2010-04-13 18:31:56
【问题描述】:

如何为我的项目中的任何 ListView.GridViewColumnHeader 定义一个全局 GridViewColumnHeader.Click 处理程序?

我的意思是可以在 app.xaml 中为 TargetType=GridViewColumnHeader 设置样式或模板,以便项目中任何列表视图中的任何列标题都会响应 app.xaml.cs 中的方法?

【问题讨论】:

    标签: wpf events


    【解决方案1】:

    虽然它不是全局事件处理程序,但我只需创建一个从 ListView 继承的新控件并在那里实现 Click 处理程序。

    【讨论】:

      【解决方案2】:

      是的,有一个警告:您可以创建适用于所有 GridViewColumnHeaders 的样式,但不能在其中设置 Click 事件。但是,您可以设置具有几乎完全相同结果的 Command 属性:

      <Application.Resources>
        <Style TargetType="GridViewColumnHeader">
          <Setter Property="Command"
                  Value="{x:Static local:GridViewClickHandler.ClickCommand}" />
        </Style>
        ...
      

      现在只需要创建命令,注册一个类处理程序,编写代码来处理它:

      public GridViewClickHandler
      {
        public RoutedCommand ClickCommand;
      
        static GridViewClickHandler()
        {
          ClickCommand = new RoutedCommand("ClickCommand", typeof(GridViewClickHandler));
          CommandManager.RegisterClassCommandBinding(
            typeof(GridViewColumnHeader),
            new CommandBinding(ClickCommand, OnColumnHeaderClick));
        }
      
        static void OnColumnHeaderClick(object sender, ExecutedRoutedEventArgs e)
        {
          // your code here
        }
      }
      

      请注意,如果您在应用程序的任何其他位置手动设置 GridViewColumnHeader 的 Command 属性,它将优先于样式。如果这是一个问题,您可能希望在您的窗口中捕获隧道 PreviewMouseDown 事件并检查每个事件以查看其原始源是否为 GridViewColumnHeader。

      【讨论】:

        猜你喜欢
        • 2012-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-05
        • 1970-01-01
        • 2017-06-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多