【问题标题】:How to set an event for all cells in WPF Datagrid如何为 WPF Datagrid 中的所有单元格设置事件
【发布时间】:2010-03-12 13:13:00
【问题描述】:

我的 WPF Datagrid 上的每个单元格都需要 OnDragEnter 事件。 我试过这个:

<ControlTemplate TargetType="{x:Type my:DataGridCell}" x:Key="RowTemplate">
    <ContentPresenter DragEnter="ContentPresenter_DragEnter" >
    </ContentPresenter>
</ControlTemplate>

但似乎不起作用。任何想法的人?


编辑:感谢您的回复,我意识到我遇到了另一个问题: 我真正的问题是TextBox 控件总是将拖放事件标记为已处理,因此即使您设置了AllowDrop="True",它看起来也像是 AllowDrop 不起作用。这不是错误,这种行为实际上是设计使然。

我使用预览事件来预测这一点,并且能够处理 D'n'D 事件。

<TextBox
    AllowDrop="True"
    PreviewDragEnter="TextBox_PreviewDragOver" 
    PreviewDragOver="TextBox_PreviewDragOver"  
    PreviewDrop="TextBox_PreviewDrop">
<TextBox/>

希望这会有所帮助。
我将您的回答标记为答案,因为它们对最初的问题是准确的。

【问题讨论】:

  • 我没有尝试过,所以我不会将它作为答案发布,但根据文档,DragEnter 事件是一个冒泡路由事件,所以你应该能够在DataGrid 级别和单元格上的 DragEnter 事件将“冒泡”。不利的一面是,如果单元格等较低级别的元素将事件标记为已处理,则此方法将不起作用,尽管您可以通过在代码中调用 AddHandler 并将 handledEventsToo 设置为 true 即 AddHandler(DragDrop.DragEnterEvent, myDragHandler, true) 来解决此问题。 /跨度>

标签: wpf xaml wpf-controls wpfdatagrid


【解决方案1】:

你很接近。

您需要设置AllowDrop,并且您需要将其设置为等于或低于您设置事件处理程序的级别。例如:

<ControlTemplate TargetType="{x:Type my:DataGridCell}" x:Key="RowTemplate"> 
  <ContentPresenter DragEnter="ContentPresenter_DragEnter" AllowDrop="true"> 
  </ContentPresenter> 
</ControlTemplate>

拖放事件仅发送到具有AllowDrop="true"UIElements。从那里它们冒泡到树上,直到它们被处理。

请注意,您可以在DataGrid 本身而不是在每个单元格上添加DragEnter 处理程序,但如果您想了解哪个单元格是放置目标的信息,您仍应在单元格级别设置AllowDrop="true"

【讨论】:

    【解决方案2】:

    我很确定您需要在单元格上将 AllowDrop 属性设置为 true。如果不将此设置为 true,则元素将不会参与拖放事件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2018-09-23
      • 2017-04-06
      相关资源
      最近更新 更多