Почему DragDrop.DoDragDrop подавляет событие щелчка DataGridHyperlinkColumn? - PullRequest
0 голосов
/ 30 мая 2019

У меня конфликт между двумя функциями, которые мне нужны в моей 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 Ответ

1 голос
/ 30 мая 2019

Ваши проблемы частично связаны с синхронностью DoDragDrop.

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

Пока вы перетаскиваете, это все, что вы делаете.

Вам также следует избегать случайного запуска перетаскивания, проверяя величину, на которую они двигали мышь после предварительного просмотра мышью вниз.

Смешивание двух частей функциональности в одном элементе управления не кажется хорошей идеей.

Я предлагаю вам дать им другой заголовок столбца или строки, который они используют для перетаскивания.

...