我有一个很多单元格的网格,其中一些是空的。我想确定MouseDown事件发生时哪个单元格是鼠标。那怎么可能?通过坐标点击网格中的哪个单元格?
0
A
回答
1
要记住的是,有一个透明背景的控制不会产生它的透明区域活动的第一件事。为所需网格设置颜色,或将其绑定到网格所在窗口的背景颜色,否则事件不会触发。
此代码示例演示了一种计算方法,用于在给定MouseMove
事件的情况下确定网格元素位置。 ButtonClick
事件参数非常相似。该样本的相关方法是ColumnComputation
和RowComputation
,它们在控制和列或行定义上进行线性分析。该示例在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);
}
相关问题
- 1. 找出点击单元格的坐标
- 2. 获取网格单元格通过鼠标点击
- 3. 通过坐标获取单元格
- 4. 通过点击增加单元格值
- 5. 单元格的哪一侧被点击
- 6. 将单元格分配给3乘3网格中的坐标
- 7. jQuery点击通过排除某些单元格的表格行
- 8. 通过点击它们来更改网格单元格的颜色
- 9. 根据网格坐标在DataGridView中获取单元格值
- 10. UITableView单元格坐标
- 11. KendoUI网格内嵌编辑:单元格双击重点单元
- 12. 确定单击哪个JTable单元格
- 13. 如何通过点击一个树元素填充网格行?
- 14. 通过按钮点击在第二张表格中添加一个单元格
- 15. 单元格在Excel中的坐标
- 16. 在js/html/css中制作单元格的可点击网格
- 17. 如何处理GXT 2.2网格中单元格的点击?
- 18. 网格X和Y坐标中的可点击JLabels?
- 19. VBA:通过宏将ColC中单元格的单元格添加到另一个单元格中的单元格
- 20. 确定在WPF网格上单击哪个单元格的方法?
- 21. 关于单元格在数据网格中点击
- 22. WinRT Xaml:点击网格中的单个元素
- 23. 如何在asp.net中点击鼠标点击gridview单元格?
- 24. C#表单点击通过表格
- 25. 通过单击获取行表格中的HTML表格单元格值
- 26. 找出哪些合并表格单元格会被点击?
- 27. 如何通过在网格视图中关注单元格来选择单元格聚焦的单元格值
- 28. 枚举通过WPF中的网格单元格
- 29. UITableViewCellAccessoryCheckmark点击单元格
- 30. 点击单元格附件
您可以使用'Mouse.DirectlyOver作为FrameworkElement',但我敢肯定,您正在使用错误的方法开始。发布相关代码和XAML。 –