2013-07-23 49 views
0

我有一個包含2行和2列的網格。託管一個Windows窗體主機控件的每個單元格。我想在用戶單擊任何單元格時捕獲所選單元格。我已經搜索並發現沒有「點擊」事件,但我可以使用具有類似結果的「MouseDown」事件。但是現在我被卡住了,因爲你會認爲必須有一種更簡單的方法,比如'GetCurentRow'和'GetCurrentColumn'來捕獲選中的單元格,但是沒有。WPF - 獲取當前單元格的詳細信息

我想要做的是在網格的特定單元格中獲取子元素。 我試着下面的代碼,但我點擊哪個小區中沒有的事,我總是得到0的行和列:

void InnerGridToContainWindowsFormsHost_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e) 
{ 
    var element = (UIElement)e.Source; 
    int c = Grid.GetColumn(element); 
    int r = Grid.GetRow(element); 
} 

有沒有獲得所選擇的任何方式/單擊的單元格的細節或細胞內的孩子嗎?

+0

'每個單元託管一個Windows窗體主機控件' - 你的winforms包含什麼? –

+0

每個單元格包含一個WindowsFormHost對象,該對象依次「託管」一個ActiveX控件。我的WPF表單包含一個主柵格,其子項和其中一個子項是另一個包含4個WindowsFormHost對象的柵格。 –

+0

一個空的'Grid'單元就是那個...空的。如果您要在每個單元格中設置一個'Fill'屬性設置爲'Rectangle',然後在單元格中單擊,您會發現'Grid.GetColumn'和'Grid.GetRow'按預期工作。我不知道爲什麼你的'WindowsFormHost'對象沒有做同樣的工作。 – Sheridan

回答

0

我認爲你可能會在這裏錯誤的路線...如果你只是想知道點擊了什麼控制,請嘗試使用​​方法。您可以在MSDN上找到有關VisualTreeHelper.HitTest Method頁面的信息。基本上,你會做這樣的事情:

private void OnMouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    // Get the position of the mouse pointer relative to the grid 
    Point clickPoint = e.GetPosition(grid); 
    HitTestResult result = VisualTreeHelper.HitTest(grid, clickPoint); 
    if (result != null) 
    { 
     // Do something here 
    } 
} 

您可能還需要一些基本的遞歸函數通過Visual對象,直到你得到你想要的向下鑽取。

+0

我已經知道電網內的控制。當用戶點擊網格時我想要的東西有兩件事:1)獲取當前單元格(行和列)並將其邊框刷變成紅色,2)獲取當前單元格中的網格的子元素。在rowdefinition(s)或columndefinition(s)上似乎沒有任何這樣的事件可以使我捕獲當前單元格(1)。我在想,如果我知道當前單元格,我應該能夠獲得正確的子網格控件,因爲所有單元格都包含相同類型的子元素。 –

+0

我已經改變了我的思路,而不是直接在單元格中使用windowsformhost控件,而是在外層網格的每個單元格中創建了4個子網格,其中包含windowsformhost控件作爲子元素。然後當mousedown事件發生時,我可以得到正確的對象。 –