2015-01-03 29 views
0

我在Grid的每個RowDefinition中都獲得了一個具有控件例如System.Windows.Controls.Image和Labels的網格。問題是,當我做右鍵單擊contextmenu它的作品,我可以得到網格,但我不能得到點擊發生的行。從ContextMenu獲取網格行#操作

  • 我不知道什麼UIElement被點擊,因爲我希望用戶能夠點擊行邊界內的任何元素。

以下是我已經,

<Grid.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Open Client CP" Background="#FF1C1C1C"/> 
        <MenuItem Header="Auto Mine" Background="#FF1C1C1C"/> 
        <MenuItem Header="Disconnect" Background="#FF1C1C1C"/> 
        <MenuItem Header="Uninstall" Background="#FF1C1C1C"/> 
        <MenuItem Header="Refresh" Background="#FF1C1C1C" Click="onRefreshMenuClick" CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=Parent}"/> 
       </ContextMenu> 
      </Grid.ContextMenu> 


private void onRefreshMenuClick(object sender, RoutedEventArgs e) 
    { 
     MenuItem mi = sender as MenuItem; 
     if (mi != null) 
     { 
      ContextMenu cm = mi.CommandParameter as ContextMenu; 
      if (cm != null) 
      { 
       Grid g = cm.PlacementTarget as Grid; 
       if (g != null) 
       { 
// need something here like g.getrowof(cm.placementtarget) 
        if (debugWindow != null) 
         debugWindow.LogTextBox.AppendText("Requested refresh from "+ row); 
       } 
      } 
     } 
    } 

回答

0

你可以打測試DataGridRow,給鼠標位置&電網。

// Retrieve the coordinate of the mouse position. 
Point pt = e.GetPosition((UIElement)sender); 

DataGridRow row = null; 

// Set up a callback to receive the hit test result enumeration. 
VisualTreeHelper.HitTest(myGrid, null, 
    new HitTestResultCallback(res => { 
     row = res.VisualHit as DataGridRow; 
     return row != null ? HitTestResultBehavior.Stop : 
     HitTestResultBehavior.Continue; 
    }), 
    new PointHitTestParameters(pt)); 

http://msdn.microsoft.com/en-us/library/ms752097.aspx(命中測試可視層)

0

也許這樣的事情?:

private void DoStuff(object sender, RoutedEventArgs e) 
{ 
    // Get the selected MenuItem 
    var menuItem = (MenuItem)sender; 

    // Get the ContextMenu for the menuItem 
    var ctxtMenu = (ContextMenu)menuItem.Parent; 

    // Get the placementTarget of the ContextMenu 
    var item = (DataGrid)ctxtMenu.PlacementTarget; 

    // Now you can get selected item/cell etc.. and cast it to your object 
    // example: 
    //var someObject = (SomeObject)item.SelectedCells[0].Item; 

    // rest of code.... 
}