Установите свойство IsMouseOver для всего элемента управления, а не для DrawingData
Я рисую треугольник, используя путь, и IsMouseOver
Свойство true, только если указатель мыши находится над треугольником. Я хотел бы, чтобы оно также было True, когда указатель находится над фоном пути (прозрачный). Как я могу получить этот результат?
<!-- language: lang-xml -->
<Style TargetType="{x:Type Path}">
<Setter Property="Stretch" Value="Uniform"/>
<Setter Property="Fill" Value="#FF9C9C9C"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="#FFBDBDBD"/>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12" Color="#FF9C9C9C" ShadowDepth="0"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
<Path Margin="6,0,0,0" StrokeThickness="0" Width="35" Height="17" Data="M0,0 L8,5, 0,10 Z"/>
3 ответа
Возможно, вы не задали правильный вопрос? Вы показали свой код (который работает просто отлично) и сказали
Я хотел бы [
IsMouseOver
свойство быть] Истинно также, когда указатель находится над фоном пути
IsMouseOver
свойство true
когда вы поместите мышь над центром (где Background
есть) из Path
, Тем не менее, ваш заголовок говорит
Установите свойство IsMouseOver для всего элемента управления, а не для DrawingData
что, конечно, что-то совсем другое (и хорошая причина, чтобы прочитать ваш вопрос, прежде чем опубликовать его). Если вы хотите иметь Path.Effect
изменить, когда вы наведите курсор мыши на весь элемент управления, то вам просто нужно написать Style
который получает доступ к этому контролю вместо этого. Опять же, вы не смогли сообщить нам, какой тип этого элемента управления может быть, поэтому я просто предположу, что это Window
, Попробуй это:
<Style TargetType="{x:Type Path}">
<Setter Property="Stretch" Value="Uniform"/>
<Setter Property="Fill" Value="#FF9C9C9C"/>
<Setter Property="Cursor" Value="Hand"/>
<Style.Triggers>
<DataTrigger Binding="{Binding IsMouseOver, RelativeSource={RelativeSource
AncestorType={x:Type Window}}}" Value="True">
<Setter Property="Fill" Value="#FFBDBDBD"/>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12"
Color="#FF9C9C9C" ShadowDepth="0"/>
</Setter.Value>
</Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Если это все еще не то, что вам нужно, то, возможно, было бы лучше конкретнее рассказать о том, что вы хотите.
ОБНОВЛЕНИЕ >>>
Теперь, когда вы объяснили, что Path
находится в Button
Я могу предложить вам просто добавить Style
для Button
изменить Cursor
:
<Style TargetType="{x:Type Button}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Cursor" Value="Hand" />
</Trigger>
</Style.Triggers>
</Style>
Одним из способов является размещение границы вокруг пути, а затем привязка к свойству IsMouseOver границы вместо пути. Чтобы это работало, фон границы должен быть явно установлен на "Прозрачный" (или любой другой цвет, который вам нравится).
Поместите границу вокруг пути:
<Border x:Name="Border" Background="Transparent" Margin="6,0,0,0" Width="17" Height="17">
<Path StrokeThickness="0" Data="M0,0 L8,5, 0,10 Z"/>
</Border>
Затем привяжите к свойству IsMouseOver границы вместо пути:
<DataTrigger Binding="{Binding IsMouseOver, ElementName=Border}" Value="True">
Поскольку траектория является своего рода формой, поэтому нарисованная фигура является областью, которая вызывает перемещение мыши, все остальные события передаются в элемент управления ниже.
Я пытался добиться того же, используя другой подход
стиль
<Style TargetType="{x:Type ContentControl}" x:Key="icon">
<Setter Property="Background" Value="#FF9C9C9C"/>
<Setter Property="Cursor" Value="Hand"/>
<Setter Property="Template" >
<Setter.Value>
<ControlTemplate TargetType="ContentControl">
<Border Background="Transparent">
<Path Stretch="Uniform" Fill="{TemplateBinding Background}" Margin="6,0,0,0" StrokeThickness="0" Data="{Binding Content, RelativeSource={RelativeSource TemplatedParent}}"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FFBDBDBD"/>
<Setter Property="Effect">
<Setter.Value>
<DropShadowEffect x:Name="DropShadowEffect" BlurRadius="12" Color="#FF9C9C9C" ShadowDepth="0"/>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
использование
<ContentControl Style="{StaticResource icon}" Width="35" Height="17" Content="M0,0 L8,5, 0,10 Z"/>
в вышеприведенном стиле я добавляю границу с прозрачным фоном, которая эффективно создает прозрачную область для событий мыши, таким образом, будет возможность захватить движение мыши над полным контролем