2015-07-02 45 views
0

DataGrid存在問題。有時(通常每3/4 ...次)用[回車]鍵提交值將開始編輯下一個單元格,並自動輸入換行符char(使單元格2行),替換當前值。所以就像用戶輸入它一樣添加[enter]鍵。BeginningEdit在輸入按下時在WPF DataGrid中提交後調用

我調試過了,當按下Enter時發生了什麼,CellEditEnding()用Commit調用,但在BeginningEdit()之後被「somebody」調用。這個不必要的BeginningEdit()的callstack和我開始手動編輯單元一樣。 再次請注意,這只是偶爾發生(但可重現)。 也許有人有一個想法,我應該開始處理這個問題? 重要的是,它只會發生,如果WPF控件通過ElementHost嵌入.NET控件,並且它被用作COM控件(在我們的情況下,從C++代碼)。 如果WPF控件直接在WPF窗口中使用,那很好,沒有這種行爲。

我附上一個屏幕以便更好地理解。

enter image description here

回答

0

我想我找到了解決方案,得到了一些線索在這裏:WPF TextBox not accepting Input when in ElementHost in Window Forms

這個問題似乎是與WPF控件到窗體.NET的集成。 按下回車鍵後會發送以下事件: WM_KEYDOWN + WM_CHAR + WM_KEYUP。

忽略輸入WM_CHAR似乎解決了雙重問題,但保持輸入鍵工作。

IntPtr ChildHwndSourceHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled) 
{ 
    if (msg == WM_CHAR) 
    { 
      // avoid duplicated enter when parent window is a native window 
      if (wParam.ToInt32() == 13) 
       handled = true; //enter is handled by WM_KEYDOWN, and WM_CHAR follows. Removing this WM_CHAR will solve the double enter issue, but keep the enter working 
    } 
    if (msg == WM_GETDLGCODE) 
    { 
     handled = true; 
     return new IntPtr(DLGC_WANTALLKEYS | DLGC_WANTARROWS | DLGC_HASSETSEL); 
    } 
    return IntPtr.Zero; 
} 
... 

Loaded += delegate 
{ 
    HwndSource s = HwndSource.FromVisual(this) as HwndSource; 
    if (s != null) 
     s.AddHook(new HwndSourceHook(ChildHwndSourceHook)); 
}; 
相關問題