【问题标题】:Prevent grid from scrolling on mouse down防止鼠标向下滚动网格
【发布时间】:2014-01-29 19:30:49
【问题描述】:

当用户的鼠标左键按下并移动时,如何防止 Windows (7/8) 滚动(触摸事件?)Infragistics UltraGrid?这种行为弄乱了我的拖放事件。

我正在使用UltraGrid 来接收和启动拖放操作。当用户单击网格中的项目时,我将变量 leftButton 设置为 true,因此我防止将项目放在自身上。我正在使用MouseLeaveElement 从网格内启动DoDragDropDragDrop

代码如下。它在 Windows XP 中工作,但在 Windows 7 和 8 中失败。mainGrid_MouseLeaveElement 现在在释放鼠标左键时被调用,这为时已晚,因为那是拖动应该完成的时候。当鼠标左键按下并移动鼠标时,看起来 Windows 操作系统正在接管。释放鼠标按钮时,它会将其释放回应用程序。

private leftMouseDown = false;

public void Fill(ToolbarForm ownerForm, DocumentOwner owner, int? ownerIdentifier)
{
    ...
    this.mainGrid.DragDrop += new DragEventHandler(grid_DragDrop);
    this.mainGrid.DragEnter += new DragEventHandler(grid_DragEnter);
    this.mainGrid.MouseDown += new MouseEventHandler(mainGrid_MouseDown);
    this.mainGrid.MouseUp += new MouseEventHandler(mainGrid_MouseUp);
    this.mainGrid.MouseLeaveElement += new Infragistics.Win.UIElementEventHandler(mainGrid_MouseLeaveElement);
    ...
}

void mainGrid_MouseLeaveElement(object sender, Infragistics.Win.UIElementEventArgs e)
{
    if (leftMouseDown)
    {
        ...
        DataObject data = new DataObject();
        data.SetFileDropList(files);
        this.mainGrid.DoDragDrop(data, DragDropEffects.Copy);
        leftMouseDown = false;
    }
}

void mainGrid_MouseUp(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
        leftMouseDown = false;
}

void mainGrid_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Left)
        leftMouseDown = true;
}

public void grid_DragDrop(object sender, DragEventArgs e)
{
    string[] filenames = (string[])e.Data.GetData(DataFormats.FileDrop);

    foreach (string filename in filenames)
    {
        this.AddDocument(filename);
    }
}

private void grid_DragEnter(object sender, DragEventArgs e)
{
    if (e.Data.GetDataPresent(DataFormats.FileDrop, false) && !leftMouseDown)
    {
        e.Effect = DragDropEffects.All;
    }

    else e.Effect = DragDropEffects.None;
}

【问题讨论】:

    标签: c# .net visual-studio infragistics ultrawingrid


    【解决方案1】:

    通过在主网格上使用 SelectionDrag 事件而不是 MouseLeaveElement 解决了这个问题。

    void maingrid_SelectionDrag(object sender, Infragistics.Win.UIElementEventArgs e)
    {
        if (leftMouseDown)
        {
            ...
            DataObject data = new DataObject();
            data.SetFileDropList(files);
            this.mainGrid.DoDragDrop(data, DragDropEffects.Copy);
            leftMouseDown = false;
        }
    }
    

    而不是

    void mainGrid_MouseLeaveElement(object sender, Infragistics.Win.UIElementEventArgs e)
    {
        if (leftMouseDown)
        {
            ...
            DataObject data = new DataObject();
            data.SetFileDropList(files);
            this.mainGrid.DoDragDrop(data, DragDropEffects.Copy);
            leftMouseDown = false;
        }
    }
    

    【讨论】:

    • 您可以发布示例代码并将问题标记为已回答吗?
    猜你喜欢
    • 2022-11-12
    • 2021-12-23
    • 2015-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-11
    • 1970-01-01
    相关资源
    最近更新 更多