【问题标题】:WPF - Get current cell detailsWPF - 获取当前单元格详细信息
【发布时间】:2013-07-23 15:59:03
【问题描述】:

我有一个包含 2 行和 2 列的网格。每个承载 Windows 的单元格形成主机控件。当用户单击任何单元格时,我想捕获选定的单元格。我搜索并发现没有“Click”事件,但我可以使用“MouseDown”事件并获得类似的结果。但是现在我被卡住了,因为您会认为必须有一种更简单的方法,例如“GetCurentRow”和“GetCurrentColumn”来捕获选定的单元格,但没有。

我想要进一步做的是在网格的特定单元格中获取子元素。 我尝试了以下代码,但无论我单击哪个单元格,行和列总是得到 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);
}

有什么方法可以获取选中/点击的单元格详细信息或单元格内的子项?

【问题讨论】:

  • Each cell hosting a windows forms host control - 你的 winform 包含什么?
  • 每个单元格都包含一个 WindowsFormHost 对象,该对象反过来“托管”一个 ActiveX 控件。我的 WPF 表单包含一个主网格及其子网格,其中一个子网格是另一个包含 4 个 WindowsFormHost 对象的网格。
  • 一个空的Grid 单元格就是……空的。如果您要在每个单元格中设置 Rectangle 并设置其 Fill 属性,然后单击单元格,您会看到 Grid.GetColumnGrid.GetRow 按预期工作。我不确定为什么你的 WindowsFormHost 对象没有做同样的工作。

标签: wpf grid


【解决方案1】:

我认为您可能在这里走错路了...如果您只想知道单击了哪个控件,请尝试使用VisualTreeHelper.HitTest 方法。您可以在 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 对象,直到找到您想要的对象。

【讨论】:

  • 我已经知道网格内的控件了。当用户单击网格时,我想要的是两件事:1)获取当前单元格(行和列)并将其边框笔刷更改为红色;2)获取当前单元格中的网格的子元素。 rowdefinition(s) 或 columndefinition(s) 上似乎没有任何此类事件可用,这将使我能够捕获 (1) 的当前单元格。我在想如果我知道当前单元格,我应该能够获得网格的正确子控件,因为所有单元格都包含相同类型的子元素。
  • 我改变了思路,不再直接在单元格中使用 windowsformhost 控件,而是在外部网格的每个单元格中创建了 4 个子网格,其中包含 windowsformhost 控件作为子项。然后我可以在 mousedown 事件引发时得到正确的对象。
猜你喜欢
  • 1970-01-01
  • 2021-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多