4

私はこれをしたい:

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

マウス カーソルがソース コードの行の上を移動すると、テーブルの左側にイメージ/ボタンが表示される様子が分かりますか? それか。

したがって、Grid があり、RowDefinition には MouseEnter および MouseLeave イベントがあります。これらのイベントは役に立たず、発生することはありません (ここで間違っている場合は修正してください)。なぜなら、これらのイベントには Background プロパティが必要であり (Transparent であっても)、RowDefinition には Background プロパティがないためです。

すべてのセルのすべての要素に MouseEnter をフックすることはできません。マウスを移動するまでに、新しく表示されるボタンが既に消えてしまうからです。

どうすればこれを機能させることができますか?

4

1 に答える 1

2

RowDefinitionsColumnDefinitionsFrameworkContentElements( ではなく) であるため、実際にはビジュアル ツリーにはありません。FrameworkElementsそのため、マウス イベントは発生しませんVisuals。それらは、Gridその子を配置するために によって使用されるだけです。

頭に浮かぶ 1 つのアプローチは、添付イベントを使用してMouse.MouseMoveMouse.MouseLeaveまたは自体のGrid子に対してこれらのイベントが発生したときに通知を受け取ることです。GridGrid

<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);
}

これで をクエリできるGridのでMouseOverRowDefinition、あとは と を比較Grid.Rowして、ImageそうMouseOverRowDefinitionGridべきかどうかを判断するだけVisibleです。

試してみたい場合は、これを行う小さなサンプル アプリをここにアップロードしました:
http://dl.dropbox.com/u/39657172/MouseOverGridRowDefinition.zip

于 2011-09-09T21:38:25.570 に答える