MouseEvent в определении строки в сетке WPF

Я пытаюсь определить, над какой строкой (RowDefinition) находится моя мышь в сетке WPF.

Я попытался добавить событие MouseEnter в RowDefinition, но событие не срабатывает, событие срабатывает в самой сетке, но это не помогает, так как мне нужно имя строки, над которой в данный момент находится мышь.

Заранее спасибо.


person Organ Grinding Monkey    schedule 17.05.2010    source источник


Ответы (1)


Имейте свой обработчик на каждом элементе, а не на самой сетке. Например. если у вас есть TextBlocks, вы можете установить обработчик, используя стиль:

<Grid Name="_grid">
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <Grid.Resources>
        <Style TargetType="TextBlock">
            <EventSetter Event="MouseEnter" Handler="EventSetter_OnHandler" />
        </Style>
    </Grid.Resources>
        <TextBlock>a</TextBlock>
        <TextBlock Grid.Row="1">b</TextBlock>
        <TextBlock Grid.Row="2">c</TextBlock>
</Grid>

Затем в обработчике вы знаете элемент из MouseEventArgs.Source. Сделайте GetValue(Grid.RowProperty), если вам нужно узнать номер строки, и если вам действительно нужно RowDefinition, получите его из Grid.RowDefinitions:

private void EventSetter_OnHandler(object sender, MouseEventArgs e)
{
    var element = (FrameworkElement) e.Source;
    var rowNumber = (int) element.GetValue(Grid.RowProperty);
    RowDefinition rowDefinition = _grid.RowDefinitions[rowNumber];
    e.Handled = true;
}
person repka    schedule 17.05.2010
comment
Я немного беспокоюсь о добавлении элементов пользовательского интерфейса в строки, потому что может быть 72 строки на сетку и от 4 до 7 сеток, поэтому может быть до 500+ строк. Меня беспокоит эффективность, и поэтому я смотрю на сетку, чтобы обеспечить событие. - person Organ Grinding Monkey; 18.05.2010
comment
Преимущество WPF заключается в том, что маршрутизируемые события, как и свойства, не инициализируются/сохраняются для каждого экземпляра. Событие будет храниться в объекте стиля, а объект стиля будет проецироваться на каждую строку. Событие ввода мыши происходит независимо от того, обрабатывается оно или нет для каждого компонента. С большим количеством строк вы должны изучить использование виртуальных панелей или что-то вроде DataGrid (он использует виртуальную панель внутри себя). Вы не хотите создавать 500 экземпляров любых элементов, которые у вас будут для каждой строки. - person repka; 19.05.2010
comment
Я знаю, что ваш ответ: не используйте MouseEnter с RowDefinition, но в каждой строке есть кнопка, которую я хочу показать/скрыть в зависимости от положения мыши в сетке. MouseEnter должен быть для каждой строки, иначе я не могу нажать кнопку (она исчезнет при MouseLeave из TextBlock). Почему не удается использовать MouseEnter с RowDefinition? - person epalm; 09.09.2011