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

时间:2019-05-30 14:06:13

标签: wpf drag-and-drop wpfdatagrid

我在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

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

此方法是否可以压缩点击事件?如果未将e.Handled设置为true,为什么colOrderNumber_Click不会触发?

1 个答案:

答案 0 :(得分:1)

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

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

在拖放时,这就是您要做的一切。

您还应通过检查预览鼠标向下移动后鼠标移动的数量来避免意外开始拖动。

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

我建议您给他们另一个用于拖动的列或行标题。