gpt4 book ai didi

c# - RowDefinition 上的 MouseEnter/MouseLeave

转载 作者:行者123 更新时间:2023-11-30 12:34:21 24 4
gpt4 key购买 nike

我想这样做:

https://github.com/rails/rails/commit/f50aeda2f73b47c47664e3651c638ba624418b8b

看看,当您的鼠标光标移过源代码行时,表格左侧会出现一个图像/按钮吗?那个。

所以我有一个网格,RowDefinition 有 MouseEnter 和 MouseLeave 事件。事实证明这些事件是无用的并且永远不会触发(如果我在这里错了请纠正我),因为它们需要一个 Background 属性(即使它是透明的),而 RowDefinition 没有 Background 属性。

我不能只在每个单元格中的每个元素上 Hook MouseEnter,因为当我移动鼠标时,新显示的按钮已经消失了。

我怎样才能让它工作?

最佳答案

RowDefinitionsColumnDefinitions 实际上不在可视化树中,因为它们是 FrameworkContentElements(而不是 FrameworkElements),这就是为什么它们不引发任何鼠标事件,它们不是 VisualsGrid 仅使用它们来定位其子节点。

想到的一种方法是使用 Grid 上的附加事件 Mouse.MouseMoveMouse.MouseLeave 来在以下时间收到通知这些事件是为 Grid 中的任何子项或 Grid 本身引发的。

<Grid Mouse.MouseMove="Grid_MouseMove"
Mouse.MouseLeave="Grid_MouseLeave"
Background="Transparent">

Mouse.MouseMove 事件处理程序中,我们可以获取鼠标相对于 Grid 的位置,并计算当前正在使用哪个 RowDefinition鼠标并将其存储在附加属性中,例如 MouseOverRowDefinition

private void Grid_MouseMove(object sender, MouseEventArgs e)
{
Grid grid = sender as Grid;
Point mousePoint = e.GetPosition(grid);
double heightSum = grid.RowDefinitions[0].ActualHeight;
int activeRow = 0;
for (; heightSum < mousePoint.Y; activeRow++)
{
heightSum += grid.RowDefinitions[activeRow].ActualHeight;
}
GridExtensions.SetMouseOverRowDefinition(grid, activeRow);
}
// No RowDefinition is beeing hoovered, set MouseOverRowDefinition to -1
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
Grid grid = sender as Grid;
GridExtensions.SetMouseOverRowDefinition(grid, -1);
}

现在我们可以为 MouseOverRowDefinition 查询 Grid 所以剩下的只是比较 Grid.Row ImageMouseOverRowDefinition 以供 Grid 决定它是否应该Visible

如果您想尝试一下,请在此处上传一个小型示例应用:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip

关于c# - RowDefinition 上的 MouseEnter/MouseLeave,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7364398/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com