Обнаружить мышь прямо над границей в WPF - PullRequest
2 голосов
/ 16 декабря 2010

У меня есть простой UserControl, прямым дочерним элементом которого является граница: -

 <Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent">
    <Grid>...Content here...</Grid>
 </Border>

Как я могу определить, что мышь находится над областью границы, то есть самой границей в 5 пикселей?Пока есть мышь, я хочу перевернуть границу кисти на другой цвет.Когда мышь перемещается в основное содержимое сетки, я хочу, чтобы кисть границы перевернулась.

Ответы [ 2 ]

8 голосов
/ 16 декабря 2010

Вы можете сделать это, разместив стиль на границе и используя Trigger .

Обратите внимание, что вам нужно установить нормальный цвет в стиле, поскольку установка его непосредственно на границе будет устанавливать локальное значение, которое переопределяет триггер.

<Border x:Name="LayoutRoot" BorderThickness="5">
    <Border.Style>
        <Style TargetType="Border">
            <Setter Property="BorderBrush" Value="Transparent"/>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="BorderBrush" Value="Green"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
    <Grid>...Content here...</Grid>
</Border>

Вы также можете поместить стиль в словарь ресурсов, чтобы вы могли поделиться им между несколькими элементами границы:

<UserControl.Resources>
    <Style TargetType="Border" x:Key="borderGreenOnHover">
        <Setter Property="BorderBrush" Value="Transparent"/>
        <Style.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter Property="BorderBrush" Value="Green"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</UserControl.Resources>
<Border x:Name="LayoutRoot" BorderThickness="5"
        Style="{StaticResource borderGreenOnHover}">
    <Grid>...Content here...</Grid>
</Border>

Если мышь находится внутри границы,курок не сработает.Это связано с тем, что по умолчанию фон для границы имеет значение null, а не прозрачный, поэтому область фона не будет реагировать на тестирование попадания .Если вы установите для свойства Border.Background значение «Прозрачный» или другой объект «Кисть», триггер сработает, если мышь находится где-нибудь над границей.

Если вам нужен ненулевой фон для границы, но вы хотите, чтобы триггер срабатывал только тогда, когда мышь находится над границей, вы можете использовать IsMouseDirectlyOver вместо IsMouseOver, что будетбыть ложным, если мышь находится над дочерним элементом.Затем вы можете установить для фона на сетке значение «Прозрачный», чтобы мышь всегда находилась над сеткой.(Действительно, если бы вы хотели, чтобы содержимое имело цвет фона, было бы проще просто установить его в сетке.)

0 голосов
/ 16 декабря 2010

Это можно проверить с помощью событий MouseEnter и MouseLeave от границы.

Xaml:

<Border x:Name="LayoutRoot" BorderThickness="5" BorderBrush="Transparent" MouseEnter="border_MouseEnter" MouseLeave="border_MouseLeave">
    <Grid>...Content here...</Grid>
</Border>

Код сзади:

private void border_MouseEnter(object sender, MouseEventArgs e)
{
    Border hoveredBorder= (Border)sender;
    hoveredBorder.BorderBrush= Brushes.Yellow;
}

private void border_MouseLeave(object sender, MouseEventArgs e)
{
    Border hoveredBorder= (Border)sender;
    hoveredBorder.BorderBrush= Brushes.Black;
}

Редактировать: Iиспользуется Border hoveredBorder = (Border) отправитель;так что вы можете использовать эти события для более чем одной границы.Если вы не хотите этого, вы можете просто удалить эту линию и получить нужную границу прямо.

Edit2: Пример приложения

...