Pergunta

Estou escrevendo um pequeno recurso de arrastar e soltar no projeto em que estou trabalhando. Eu já fiz esse tipo de recurso várias vezes antes e sempre uso uma combinação de PreviewLeftMouseButtonDown e PreviewMouseMove Para detectar o início de um arrasto. Sempre funcionou antes.

Neste projeto, porém, estou encontrando PreviewMouseMove não está disparando quando o botão esquerdo do mouse é clicado, mesmo que o mouse esteja claramente movendo na tela. Eu tenho Nunca Vi isso antes e isso está me deixando triste.

Este é o xaml que estou usando:

<Grid Background="{StaticResource BGGradientBrush}"
      Margin="1"
      PreviewMouseLeftButtonDown="Grid_PreviewMouseLeftButtonDown"
      PreviewMouseMove="Grid_PreviewMouseMove">

      <!-- snip -->
</Grid>

E este é o meu código atrás:

    private Point _startDragPoint;
    private bool _isDragging;

    private void Grid_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
    {
        _startDragPoint = e.GetPosition(null);
        System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseLeftButtonDown) left click at " + _startDragPoint);
    }

    private void Grid_PreviewMouseMove(object sender, MouseEventArgs e)
    {
        System.Diagnostics.Trace.WriteLine("Test => (PreviewMouseMove) enter, e.LeftButton: " + e.LeftButton + ", _isDragging: " + _isDragging);

        if (e.LeftButton == MouseButtonState.Pressed && !_isDragging)
        {
            System.Diagnostics.Trace.WriteLine(
                "Test => (PreviewMouseMove) well, the left mouse button is pressed");

            var position = e.GetPosition(null);
            if (Math.Abs(position.X - _startDragPoint.X) > SystemParameters.MinimumHorizontalDragDistance ||
                Math.Abs(position.Y - _startDragPoint.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
                StartDrag();
            }
        }
    }

    private void StartDrag()
    {
        System.Diagnostics.Trace.WriteLine("Test => (StartDrag) started drag!");
    }

Estou monitorando essas declarações de rastreamento via debugview e entre o tempo Grid_PreviewMouseLeftButtonDown é demitido, até que o botão esquerdo do mouse seja liberado, Grid_PreviewMouseMove é Nunca despedido.

Estou completamente perplexo, alguém pode identificar algo que estou fazendo de errado? Apenas para a sanidade me verifiquei que tenho me referido ao de Jaime Rodriquez Arrastar e soltar no WPF explicado de ponta a ponta Artigo e estou claramente usando a mesma técnica que ele é, então o que poderia estar causando isso? Estou realmente esperando que seja apenas algo estúpido que estou perdendo. Alguma ideia?

Foi útil?

Solução

Estou usando um XamdataGrid do Infragistics para hospedar meus controles de usuário que exigem funcionalidade de arrastar e soltar. Acontece que a grade prende os eventos de mousemove quando o botão esquerdo do mouse é pressionado. Muito irritante. Não tenho certeza de como consertá -lo ou contornar isso, mas pelo menos sei o que está dando errado agora.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top