C# 如何获取WPF数据网格单元的位置?
我有一个C# 如何获取WPF数据网格单元的位置?,c#,wpf,datagrid,wpfdatagrid,C#,Wpf,Datagrid,Wpfdatagrid,我有一个DataGrid绑定到Appointment对象的集合。网格显示给定星期的约会,列为天,行为时间,因此每个单元格都绑定到一个约会 当用户单击一个单元格时,我想显示一个小窗口,其中包含该单元格的约会摘要。由于复杂的原因,我无法为单元格设置模板以显示摘要,更重要的是,我希望摘要下拉并覆盖选定单元格下方的单元格 在与单击链接的命令中,通过一些魔术,我获得了所选单元格本身的DataGridCellInfo,但该对象没有任何定位提示,只有一些维度。双击的输入绑定如下所示: <DataGrid
DataGrid
绑定到Appointment
对象的集合。网格显示给定星期的约会,列为天,行为时间,因此每个单元格都绑定到一个约会
当用户单击一个单元格时,我想显示一个小窗口,其中包含该单元格的约会摘要。由于复杂的原因,我无法为单元格设置模板以显示摘要,更重要的是,我希望摘要下拉并覆盖选定单元格下方的单元格
在与单击链接的命令中,通过一些魔术,我获得了所选单元格本身的DataGridCellInfo
,但该对象没有任何定位提示,只有一些维度。双击的输入绑定如下所示:
<DataGrid.InputBindings>
<!--TODO Remove name 'TheGrid' and find parent DataGrid-->
<MouseBinding MouseAction="LeftDoubleClick" Command="{Binding ApptClickCommand}" CommandParameter="{Binding ElementName=TheGrid, Path=SelectedCells}" />
</DataGrid.InputBindings>
命令代码接收类型为
SelectedCellsCollection
的参数,该参数只包含一个DataGridCellInfo
。我在命令中没有其他信息可供使用。事实上,我对viewmodel中的视图非常熟悉,所以我希望避免过分使用事件背后的代码。弹出窗口是特定于用户界面的,我认为应该以某种方式从视图中定位
在过去,我的ViewModel跟踪实际数据、SelectedItem和IsDetailsVisible的标志
从视图中,我将有一个“弹出”用户控件,它位于我的网格顶部。它的可见性绑定到IsDetailsVisible
属性,数据绑定到SelectedItem
。对于我的项目,弹出窗口是居中的,但是让视图设置PopupUserControl的上/左属性应该很容易,这样它就匹配了用户单击的单元格
要在UI中查找实际的网格单元,有几种方法。最简单的方法可能是使用Click或MouseDown事件,然后根据单击的DataGridCell定位PopupUserControl。正如我所说的,这种事情对我来说是特定于视图的,所以应该在视图后面的代码中
而且,我从来都不喜欢WPF的弹出窗口,所以我创建了自己的自定义用户控件,我会一直使用它。如果您对使用该代码或执行类似操作感兴趣,可以在我的博客上找到该代码。下面是一个示例,说明如何获取DataGridCell元素,然后使用Visual.PointToScreen方法查找其屏幕坐标:
private void AppClickCommandExecuted(IList<DataGridCellInfo> cells)
{
if(cells != null && cells.Count > 0)
{
DataGridCellInfo cellInfo = cells[0];
FrameworkElement cellContent = cellInfo.Column.GetCellContent(cellInfo.Item);
if (cellContent != null)
{
DataGridCell cell = cellContent.Parent as DataGridCell;
if(cell != null)
{
Point screenCoordinates = cell.PointToScreen(new Point(0, 0));
//place your popup based on the screen coordinates of the cell...
}
}
}
}
private void AppClickCommandExecuted(IList单元格)
{
if(cells!=null&&cells.Count>0)
{
DataGridCellInfo-cellInfo=单元格[0];
FrameworkElement cellContent=cellInfo.Column.GetCellContent(cellInfo.Item);
if(cellContent!=null)
{
DataGridCell=cellContent.Parent作为DataGridCell;
如果(单元格!=null)
{
点屏幕坐标=单元格点屏幕(新点(0,0));
//根据单元格的屏幕坐标放置弹出窗口。。。
}
}
}
}
你在寻找什么样的“位置”?@mm8屏幕坐标,因此,正如我所说,我希望“摘要下拉并覆盖所选单元格下方的单元格”。你看到我的答案了吗?@mm8,是的,但我还没有尝试过。