WPF ItemsControl IsMouseOver не работает должным образом

У меня есть следующий код в Window.Resources окна WPF. В основном он создает элемент, представляющий сетку с меткой, расположенной слева, и кнопкой справа. Когда я навожу курсор на метку или кнопку, строка меняет цвет, как и ожидалось, но я хочу, чтобы она также меняла цвет, если мышь находится над какой-либо строкой.

Как этого добиться?

Любая помощь приветствуется.

<Window.Resources>
    <dtos:ProjectDto x:Key="data"/>
    <Style x:Key="alternatingWithTriggers" 
           TargetType="{x:Type ContentPresenter}">
        <Setter Property="Height" Value="25"></Setter>
    </Style>
    <Style x:Key="onmouseover" TargetType="{x:Type DockPanel}">
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="Background" Value="Yellow">
                </Setter>
            </Trigger>
        </Style.Triggers>
    </Style>

    <DataTemplate x:Key="ItemTemplate">
        <Border x:Name="ItemBorder" HorizontalAlignment="Stretch" BorderThickness="0" Background="#BBB" ClipToBounds="True" >
            <DockPanel ClipToBounds="True" HorizontalAlignment="Stretch" Style="{StaticResource onmouseover}">
                <Label Content="{Binding Name}" HorizontalAlignment="Left" Height="80"></Label>
                <Button Content="Delete" HorizontalAlignment="Right" Margin="0,0,10,0"/>
            </DockPanel>
        </Border>
...

person Burt    schedule 31.12.2009    source источник


Ответы (2)


Я не вижу ничего явно неправильного в опубликованном вами фрагменте, и, поскольку я не сижу перед Studio, я не могу попробовать, но на вашем месте я бы попробовал добавить обработчик MouseEnter на DockPanel (просто добавьте обработчик бездействия в код программной части для представления, так как вы удалите его позже).

Убедитесь, что при входе в обработчик происходит попадание, а в окне отладчика/немедленного убедитесь, что свойство IsMouseOver соответствует вашим ожиданиям. Это, по крайней мере, направит ваши следующие шаги отладки:

Если IsMouseOver истинно и ваш обработчик сработал, то я предполагаю, что что-то в настроенном вами триггере не совсем правильно.

Если IsMouseOver имеет значение false или ваш обработчик не сработал, то я предполагаю, что для IsHitTestVisible установлено значение false или что-то в этом роде.

Ради интереса я бы также попробовал переместить объявление стиля в док-панель, просто чтобы убедиться, например:

<DataTemplate x:Key="ItemTemplate"> 
    <Border x:Name="ItemBorder" HorizontalAlignment="Stretch" BorderThickness="0" Background="#BBB" ClipToBounds="True" > 
        <DockPanel ClipToBounds="True" HorizontalAlignment="Stretch">
            <DockPanel.Style>
                <Style TargetType="{x:Type DockPanel}">  
                    <Style.Triggers>  
                        <Trigger Property="IsMouseOver" Value="True">  
                            <Setter Property="Background" Value="Yellow"/>  
                        </Trigger>  
                    </Style.Triggers>  
                </Style> 
            </DockPanel.Style>
            <Label Content="{Binding Name}" HorizontalAlignment="Left" Height="80"></Label> 
            <Button Content="Delete" HorizontalAlignment="Right" Margin="0,0,10,0"/> 
        </DockPanel> 
    </Border> 
person JerKimball    schedule 31.12.2009

Дайте DockPanel Background="Transparent". Это должно позволить ему захватывать события мыши.

person RandomEngy    schedule 31.12.2009
comment
Спасибо за ответ, но, к сожалению, ваше предложение не сработало. Вы можете думать о чем-нибудь другом? - person Burt; 31.12.2009
comment
Вместо этого попробуйте Background="#00000000" - person Aviad P.; 31.12.2009
comment
У меня только что была эта проблема. Установка фона на прозрачный работает на сетке. - person oillio; 17.03.2011