No puedo aplicar un estilo MouseOver a una ruta dentro de un ContentPresenter.Aplicación de estilo a la ruta dentro de ContentPresenter (BasadoNo está funcionando!)
que tienen un estilo de botón que contiene una ContentPresenter:
<Style x:Key="ContentButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ContentPresenter
x:Name="contentPresenter"
Content="{TemplateBinding Content}">
<ContentPresenter.Resources>
<Style TargetType="{x:Type Path}"
BasedOn="{StaticResource ContentButtonPathStyle}"/>
</ContentPresenter.Resources>
</ContentPresenter>
Aquí es un estilo para que pueda tener un efecto de vuelco en el Camino:
<Style x:Key="ContentButtonPathStyle" TargetType="{x:Type Path}">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Fill" Value="#FF00FF10"/>
<Setter Property="Stroke" Value="Red"/>
<Setter Property="StrokeThickness" Value="6"/>
</Trigger>
</Style.Triggers>
<Setter Property="Stroke" Value="Red"/>
<Setter Property="Fill">
<Setter.Value>
<LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
<GradientStop Color="#FFB4B3E7" Offset="0"/>
<GradientStop Color="#FF0800FF" Offset="1"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
que también tienen un archivo de recursos para los iconos con un Viewbox que contiene una ruta:
<Viewbox x:Key="MyIcon">
<Grid>
<Path Data="M78,296 L37.5,306.5 45.5,354.5 123.5,343.5 z" />
</Grid>
</Viewbox>
Y finalmente, creo un botón y le asigno el Vi ewbox recursos para el Contenido:
<Button Style="{DynamicResource ContentButton}">
<ContentPresenter Content="{DynamicResource MyIcon}"/>
</Button>
El uso de "BasedOn" al estilo de los contenidos de la ContentPresenter es una técnica que he encontrado aquí:
http://social.msdn.microsoft.com/forums/en-US/wpf/thread/412b1747-60e9-4b9a-8f8f-bd56f3aff875/
Sin embargo, no funciona para mí ... he pasado muchas horas tratando de resolver esto!
¿Alguna idea?
Gracias!
Bueno, según la excelente respuesta de Mackho, este es mi último XAML.
¡También agregué un DataTriggeer para IsPressed, que funciona genial!
espero que esto ayude a alguien ...
En primer lugar, el estilo:
<Style x:Key="ContentButtonPathStyle" TargetType="{x:Type Path}">
<Style.Triggers>
<DataTrigger Binding="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsMouseOver}" Value="True">
<Setter Property="Fill" Value="Yellow"/>
<Setter Property="Stroke" Value="Blue"/>
</DataTrigger>
<DataTrigger Binding="{Binding RelativeSource=
{RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=IsPressed}" Value="True">
<Setter Property="Fill" Value="Red"/>
<Setter Property="Stroke" Value="Black"/>
</DataTrigger>
</Style.Triggers>
<Setter Property="Fill" Value="Green"/>
<Setter Property="Stroke" Value="Red"/>
</Style>
A continuación, el icono mismo:
<Viewbox Stretch="Fill" x:Shared="False" x:Key="MyIcon">
<Path StrokeThickness="6" Data="M160.26077,0.5 L196.5,36.739223 232.73923,0.5 251.12399,18.884777 214.88478,55.124001 251.12399,91.363222 232.73923,109.748 196.5,73.508779 160.26077,109.748 141.87601,91.363222 178.11522,55.124001 141.87601,18.884777 z" Stretch="Fill"/>
</Viewbox>
A continuación, la plantilla:
<Style x:Key="ContentButton" TargetType="{x:Type Button}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<ControlTemplate.Resources>
<Style TargetType="{x:Type Path}" BasedOn="{StaticResource ContentButtonPathStyle}"/>
</ControlTemplate.Resources>
<Grid Background="Transparent"><ContentPresenter /></Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Y, por último, vamos a colocar un unos botones que utilizan la plantilla y estilo:
<Grid>
<Button Style="{DynamicResource ContentButton}" HorizontalAlignment="Left" Width="128" Height="128" VerticalAlignment="Top" Margin="85.5,87,0,0">
<ContentPresenter Content="{DynamicResource MyIcon}" d:IsLocked="True"/>
</Button>
<Button Style="{DynamicResource ContentButton}" Height="64" VerticalAlignment="Top" Margin="0,87,204.5,0" HorizontalAlignment="Right" Width="64">
<ContentPresenter Content="{DynamicResource MyIcon}" d:IsLocked="True"/>
</Button>
<Button Style="{DynamicResource ContentButton}" Height="96" VerticalAlignment="Bottom" Margin="234,0,0,66.5" HorizontalAlignment="Left" Width="96">
<ContentPresenter Content="{DynamicResource MyIcon}" d:IsLocked="True"/>
</Button>
<Button Style="{DynamicResource ContentButton}" Height="32" VerticalAlignment="Bottom" Margin="0,0,138.5,130.5" HorizontalAlignment="Right" Width="32">
<ContentPresenter Content="{DynamicResource MyIcon}" d:IsLocked="True"/>
</Button>
</Grid>
1, esto definitivamente funciona! Por cierto, otra solución es envolver el viewbox con un datatemplate y asignarlo a la plantilla de contenido del botón, tampoco estoy seguro de por qué el contenido de enlace no funciona. :( –
Utilizando funciona para mí! Una pregunta más: ahora, el mouse-over solo funciona en la ruta en sí ... ¡no en la vista/botón! Así que mi mouse parpadea cuando toca las partes de la ruta ¿Hay alguna manera de obtener el efecto mouseover cuando el mouse pase sobre el botón, no solo la ruta? Gracias –
user1084857
He editado mi respuesta, a ver si funciona para usted – MaRuf