簡體   English   中英

防止網格在鼠標向下滾動

[英]Prevent grid from scrolling on mouse down

當用戶的鼠標左鍵按下並移動時,如何防止Windows(7/8)滾動(觸摸事件?) Infragistics UltraGrid 此行為使我的拖放事件變得混亂。

我正在使用UltraGrid接收並啟動拖放。 當用戶單擊網格中的項目時,我將變量leftButton設置為true,因此可以防止將該項目放到自身上。 我正在使用MouseLeaveElement從網格內部啟動DoDragDrop DragDrop

代碼如下。 它在Windows XP中工作,但在Windows 7和8中失敗。現在,釋放鼠標左鍵時將調用mainGrid_MouseLeaveElement ,這已經很晚了,因為拖動應該已經完成​​。 按下鼠標左鍵並移動鼠標時,Windows OS似乎正在接管。 釋放鼠標按鈕時,它將釋放回應用程序。

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;
}

通過在maingrid上使用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;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM