2013-07-22 55 views
0

我有一个很多单元格的网格,其中一些是空的。我想确定MouseDown事件发生时哪个单元格是鼠标。那怎么可能?通过坐标点击网格中的哪个单元格?

+1

您可以使用'Mouse.DirectlyOver作为FrameworkElement',但我敢肯定,您正在使用错误的方法开始。发布相关代码和XAML。 –

回答

1

要记住的是,有一个透明背景的控制不会产生它的透明区域活动的第一件事。为所需网格设置颜色,或将其绑定到网格所在窗口的背景颜色,否则事件不会触发。

此代码示例演示了一种计算方法,用于在给定MouseMove事件的情况下确定网格元素位置。 ButtonClick事件参数非常相似。该样本的相关方法是ColumnComputationRowComputation,它们在控制和列或行定义上进行线性分析。该示例在UI元素上运行。

Form类:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 



    private void InnerGrid_PreviewMouseMove(object sender, MouseEventArgs e) 
    { 
     this.XCoordinate.Text = e.GetPosition(InnerGrid).X.ToString(); 
     this.YCoordinate.Text = e.GetPosition(InnerGrid).Y.ToString(); 
     this.ColumnPosition.Text = ColumnComputation(InnerGrid.ColumnDefinitions, e.GetPosition(InnerGrid).X).ToString(); 
     this.RowPosition.Text = RowComputation(InnerGrid.RowDefinitions, e.GetPosition(InnerGrid).Y).ToString(); 

    } 

    private double ColumnComputation(ColumnDefinitionCollection c, double YPosition) 
    { 
     var columnLeft = 0.0; var columnCount = 0; 
     foreach (ColumnDefinition cd in c) 
     { 
      double actWidth = cd.ActualWidth; 
      if (YPosition >= columnLeft && YPosition < (actWidth + columnLeft)) return columnCount; 
      columnCount++; 
      columnLeft += cd.ActualWidth; 
     } 
     return (c.Count + 1); 
    } 
    private double RowComputation(RowDefinitionCollection r, double XPosition) 
    { 
     var rowTop = 0.0; var rowCount = 0; 
     foreach (RowDefinition rd in r) 
     { 
      double actHeight = rd.ActualHeight; 
      if (XPosition >= rowTop && XPosition < (actHeight + rowTop)) return rowCount; 
      rowCount++; 
      rowTop += rd.ActualHeight; 
     } 
     return (r.Count + 1); 
    } 
} 

XAML形式:

<Window x:Name="window" x:Class="GridHitTest.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid Name="OuterBorder" > 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
      <ColumnDefinition/> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="20"/> 
      <RowDefinition Height="20"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 
     <TextBlock Grid.Column="0" HorizontalAlignment="Center" >X Coordinate</TextBlock> 
     <TextBlock Grid.Column="1" HorizontalAlignment="Center" >Y Coordinate</TextBlock> 
     <TextBlock Grid.Column="2" HorizontalAlignment="Center" >Column</TextBlock> 
     <TextBlock Grid.Column="3" HorizontalAlignment="Center" >Row</TextBlock> 
     <TextBlock Grid.Row="1" Grid.Column="0" HorizontalAlignment="Center" Name="XCoordinate">kjahsd</TextBlock> 
     <TextBlock Grid.Row="1" Grid.Column="1" HorizontalAlignment="Center" Name="YCoordinate">___ahsdjf</TextBlock> 
     <TextBlock Grid.Row="1" Grid.Column="2" HorizontalAlignment="Center" Name="ColumnPosition">___ahsdjf</TextBlock> 
     <TextBlock Grid.Row="1" Grid.Column="3" HorizontalAlignment="Center" Name="RowPosition">___ahsdjf</TextBlock> 
     <Grid Name="InnerGrid" Margin="20,45,20,10" Grid.ColumnSpan="4" Grid.RowSpan="3" Background="{Binding Background, ElementName=window}" PreviewMouseMove="InnerGrid_PreviewMouseMove" > 
      <Grid.RowDefinitions> 
       <RowDefinition/> 
       <RowDefinition/> 
       <RowDefinition/> 
      </Grid.RowDefinitions> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition/> 
       <ColumnDefinition/> 
       <ColumnDefinition/> 
      </Grid.ColumnDefinitions> 
     </Grid> 
    </Grid> 
</Window> 
1

将一个按钮放入空单元格(或所有单元格中的按钮,但其他项目存在时隐藏的样式并使该单元格不为空)。然后,当用户点击该单元格,报告小区如

private void OnButtonClick(object sender, RoutedEventArgs e) 
{ 
    var buttonClicked = sender as Button; 

    var gridRow = (int)buttonClicked.GetValue(MyGrid.RowProperty); 
    var gridColumn = (int)buttonClicked.GetValue(MyGrid.ColumnProperty); 

} 
0

这里是一个似乎比建议的正确答案更简单的另一种选择。

private void Grid_MouseDown(object sender, MouseButtonEventArgs e) 
{ 
    var element = (UIElement)e.Source; 
    int row = Grid.GetRow(element); 
    int column = Grid.GetColumn(element); 
} 
相关问题