为什么 DragDrop.DoDragDrop 压缩 DataGridHyperlinkColumn 单击事件?

Why does DragDrop.DoDragDrop squash the DataGridHyperlinkColumn click event?

我在 DataGrid 中想要的两个功能之间存在冲突。 DataGrid的定义如下:

<DataGrid x:Name="dgSalesOrders" IsReadOnly="True" SelectionMode="Single" SelectionUnit="FullRow"  PreviewMouseLeftButtonDown="dgSalesOrders_PreviewMouseLeftButtonDown">
    <DataGrid.Columns>
        <DataGridHyperlinkColumn Header="Order #" Binding="{Binding SalesOrderNumber}" IsReadOnly="True">
            <DataGridHyperlinkColumn.ElementStyle>
                <Style TargetType="TextBlock">
                    <EventSetter Event="Hyperlink.Click" Handler="colOrderNumber_Click"/>
                </Style>
            </DataGridHyperlinkColumn.ElementStyle>
        </DataGridHyperlinkColumn>
    </DataGrid.Columns>
</DataGrid>

dgSalesOrders_PreviewMouseLeftButtonDown如下:

private void dgSalesOrders_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e) {
    prevRowIndex = getDataGridItemCurrentRowIndex(e.GetPosition, dgSalesOrders);
    if (prevRowIndex < 0 || dgSalesOrders.SelectedItems.Count == 0)
        return;
    dgSalesOrders.SelectedIndex = prevRowIndex;

    List<SalesOrder> selectedOrders = new List<SalesOrder>();
    foreach (ThinSalesOrder salesOrder in dgSalesOrders.SelectedItems)
        selectedOrders.Add(salesOrder);

    ThinSalesOrder selectedOrder = (ThinSalesOrder)dgSalesOrders.Items[prevRowIndex];
    if (selectedOrder == null)
        return;

    DataObject data = new DataObject(salesOrdersFormat, selectedOrders.ToArray());

    if (DragDrop.DoDragDrop(dgSalesOrders, data, DragDropEffects.Move) != DragDropEffects.None)
        dgSalesOrders.SelectedItem = selectedOrder;


}//dgSalesOrders_PreviewMouseLeftButtonDown

我的问题是,如果调用 DragDrop.DoDragDrop(dgSalesOrders, data, DragDropEffects.Move),超链接点击事件 (colOrderNumber_Click) 不会触发。

这个方法有什么方法可以压缩点击事件吗?如果 e.Handled 没有设置为 true,为什么 colOrderNumber_Click 不触发?

你的问题部分是因为 DoDragDrop 是同步的。

http://www.csharp411.com/dodragdrop-is-synchronous/

当你拖放时,你所做的就是这些。

您还应该通过检查他们在预览鼠标按下后移动鼠标的量来避免意外开始拖动。

在一个控件中混合这两项功能似乎不是一个好主意。

我建议你给他们另外的列或行 header 他们用来拖动。