2014-10-30 66 views
1

我在做什麼:我目前在我的WPF應用程序中託管了OpenTK glControl(通過WindowsFormsHost)。該應用程序有很多按鈕,但我們將專注於暫停和播放按鈕。我使用VBO的,這是我如何動畫GL.DrawArrays(PrimitiveType.LineStrip, 0, frameCount);。它正在繪製從0到framecount的頂點範圍,所以當我玩遊戲時,它只是開始遞增framecount,開始動畫。當使用鼠標時,一切都很完美。OpenTK讓觸摸按鈕提升點擊事件與鼠標不同

問題:我的應用程序需要具有觸摸屏也(FWIW,當我說觸摸,WPF是看到它作爲一個手寫筆,不碰)工作。當應用程序不是動畫時,觸摸就像它應該那樣工作,我不處理觸摸事件,所以觸摸按鈕剛剛引發了事件Click。如果我們不是動畫,我沒有任何問題。因此,當我使用我的鼠標Click播放按鈕時,用戶界面仍然響應我的鼠標(點擊工作,懸停改變顏色,因爲它應該等),但接觸似乎忽略了一段時間。我必須在它做它應該(如暫停)之前觸摸按鈕3到5次。讓我們回去,現在我們不是動畫,這一次,如果我觸摸播放按鈕來提高事件,它會開始動畫,但現在我的觸摸有相同的問題,不得不多次觸摸以提高事件,最重要的是,用戶界面現在不響應鼠標(WindowsFormsHost仍然對鼠標事件做出正確反應)。點擊按鈕或懸停在按鈕上不會執行任何操作。直到我可以讓動畫再次暫停,UI再次響應鼠標。

什麼我都試過,什麼(我想)我知道:當UI停止響應鼠標輸入和觸摸輸入messsed起來,如果我使用鼠標或觸摸到的任何地方點擊我的應用程序之外,它的工作原理如預期。這導致我相信這不是觸摸屏驅動程序問題或任何其他問題。我還使用Snoop來查看正在發生什麼事件(或不發生),以查看手寫筆和鼠標被捕獲和釋放以及焦點。我找不到一個沒有發佈的實例。如果有人願意,我可以發佈顯示鼠標和觸摸點擊之間差異的Snoop結果。我嘗試在MainWindow上放置一個預覽鼠標,但在觸摸播放後,沒有鼠標單擊會引發此事件,並且在觸摸播放按鈕之後的第一個觸摸隨機觸摸將觸發此事件。我也嘗試隱藏WindowsFormsHost,鼠標和觸摸點擊所有的工作,像他們應該減去glControl。因爲我隱藏了WindowsFormsHost,繪畫事件永遠不會被解僱,導致我相信繪畫功能可能存在問題。我知道這個錯誤WPF Touch Bug,但我真的不認爲這是我的問題。有些事告訴我互操作性是給我的問題,但我不確定。

我的代碼:

private void playFwdFunc() 
    { 
     //disable undrawing and enable drawing 
     undraw = false; 
     draw = true; 

     //unpause animation 
     paused = false; 
     //enable/disable appropriate buttons 
     pauseBtn.IsEnabled = true; 
     stepBackBtn.IsEnabled = false; 
     stepFwdBtn.IsEnabled = false; 
     clearStart.IsEnabled = true; 
     clearCurrent.IsEnabled = true; 
     //refresh control 
     glControl1.Invalidate(); 
    } 


    private void playFwdClick(object sender, RoutedEventArgs e) 
    { 
     playFwdFunc(); 

    } 

在我glPaint事件:

if (frameCount < vertices.Length && !paused) 
      { 
       //draw more vertices 
       if (draw) 
       { 
        if (0 < (int)(vertices.Length/(25000/speedTrack.Value))) 
         frameCount += (int)(vertices.Length/(25000/speedTrack.Value)); 
        else 
         frameCount++; 
       } 


       //draw less vertices 
       else if (undraw) 
       { 
        if (0 < (int)(vertices.Length/(25000/speedTrack.Value))) 
         frameCount -= (int)(vertices.Length/(25000/speedTrack.Value)); 
        else 
         frameCount--; 
       } 


       //make sure we dont have a negative framecount (null pointer) 
       if (frameCount < 0) 
       { 
        paused = true; 
        frameCount = 0; 
       // manageCodeBox(); 

       } 
       //make sure we dont exceed # of vertices (null pointer) 
       else if (frameCount > vertices.Length) 
       { 
        frameCount = vertices.Length; 
        paused = true; 
       // manageCodeBox(); 
       } 

      } 

我的問題:爲什麼點擊鼠標使UI按鈕的反應不同於觸摸按鈕,即使他們提出了同樣的事件?任何輸入讚賞。

回答

0

所以我發現是什麼導致了這種行爲,在我的繪畫功能中,我不斷地提出了一個事件,它有一個glControl1.Invalidate()

我最好的猜測:我唯一真正的猜測是,某些事件等觸摸的觸控筆發生某些線程調用如何當glControl1.Invalidate()進入活鎖與UI線程。我認爲這就是爲什麼一些接觸被接受,但UI線程從未到達鼠標事件監聽器。正如我所說:最好的猜測。

我的解決方法:我最初做了一個DispatcherTimer致電glControl1.Invalidate()。鼠標事件工作正常,但由於觸摸被提升爲鼠標點擊,除非我處理觸摸事件(我不想爲我的UI上的每個按鈕執行操作),否則會出現延遲。我的下一個解決方案似乎工作到目前爲止。

在我的windows構造函數中:CompositionTarget.Rendering += invalidateProcessor;

功能:

private void invalidateProcessor(object sender, EventArgs e) 
    { 
     Dispatcher.BeginInvoke(new Action(() => { if (!paused) glControl1.Invalidate(); }), DispatcherPriority.Background); 
    } 

我選擇DispatcherPriority.Background因爲較高的優先級再次引起觸摸延遲。