Estoy tratando de establecer el color Foreground
en un Hyperlink
usando un objeto Style
en un ancestro Resources
, pero no está teniendo ningún efecto. Incluso utilicé la sugerencia BasedOn
de Changing Hyperlink foreground without losing hover color, pero no marcó la diferencia, aún obtengo un hipervínculo azul que está en rojo al pasar el mouse.¿Cómo propagar estilos a hipervínculos dentro de un DataTemplate?
Aquí está el XAML para mis controles, incluyendo un ItemsControl
cuyos ítems se muestran utilizando un hipervínculo:
<StackPanel Background="Red" TextElement.Foreground="White">
<StackPanel.Resources>
<Style TargetType="Hyperlink" BasedOn="{StaticResource {x:Type Hyperlink}}">
<Setter Property="Foreground" Value="Yellow"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock>Data import errors</TextBlock>
<ItemsControl ItemsSource="{Binding Errors}"/>
</StackPanel>
Y los elementos de la ItemsControl
están recogiendo la siguiente DataTemplate
:
<DataTemplate DataType="{x:Type Importer:ConversionDetailsMessage}">
<TextBlock>
<Run Text="{Binding Message, Mode=OneTime}"/>
<Hyperlink Command="Common:ImportDataCommands.ExplainConversionMessage" CommandParameter="{Binding}">
<Run Text="{Binding HelpLink.Item2, Mode=OneTime}"/>
</Hyperlink>
</TextBlock>
</DataTemplate>
Es También vale la pena señalar que no quiero simplemente establecer los diferentes colores directamente en el Hyperlink
en el DataTemplate
. Esto se debe a que la plantilla será utilizada por un número de diferentes objetos ItemsControl
, la mayoría de los cuales estarán sobre un fondo blanco y pueden usar los colores estándar de hipervínculo. (Tenga en cuenta que el que está en el XAML de arriba, sin embargo, tiene un fondo rojo.)
En resumen, no quiero que el DataTemplate
tenga que saber nada sobre el control en el que se está utilizando. Los estilos para los controles de la plantilla solo deberían filtrarse hacia abajo.
Entonces ... ¿alguien me puede decir por qué el estilo no se está filtrando y qué puedo hacer para solucionarlo?
Gracias.
Actualización:
Como no podía obtener la respuesta de Pavlo a trabajar en mi aplicación de producción, ya que he probado en una aplicación de prueba independiente. La aplicación es una aplicación de WinForms, con el formulario principal que contiene nada más que un ElementHost
, que a su vez contiene un simple control de usuario de WPF. Aquí está su XAML:
<UserControl x:Class="DataTemplateStyling.StylingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:DataTemplateStyling="clr-namespace:DataTemplateStyling"
x:Name="root" Loaded="StylingViewLoaded">
<UserControl.Resources>
<Style x:Key="MyDefaultHyperlinkStyle" BasedOn="{StaticResource {x:Type Hyperlink}}"/>
<DataTemplate DataType="{x:Type DataTemplateStyling:ImportMessage}">
<DataTemplate.Resources>
<Style TargetType="{x:Type Hyperlink}"
BasedOn="{StaticResource MyDefaultHyperlinkStyle}"/>
</DataTemplate.Resources>
<TextBlock>
<Run Text="{Binding Message, Mode=OneTime}"/>
<Hyperlink NavigateUri="{Binding HelpLink.Item1}">
<Run Text="{Binding HelpLink.Item2, Mode=OneTime}"/>
</Hyperlink>
</TextBlock>
</DataTemplate>
</UserControl.Resources>
<Grid DataContext="{Binding ElementName=root}">
<StackPanel Background="Red" TextElement.Foreground="White">
<StackPanel.Resources>
<Style x:Key="MyDefaultHyperlinkStyle" TargetType="Hyperlink" BasedOn="{StaticResource {x:Type Hyperlink}}">
<Setter Property="Foreground" Value="Yellow"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="White"/>
</Trigger>
</Style.Triggers>
</Style>
</StackPanel.Resources>
<TextBlock>Data import errors</TextBlock>
<ItemsControl ItemsSource="{Binding Messages}"/>
</StackPanel>
</Grid>
</UserControl>
Tal como está arriba, esto genera una InvalidOperationException
, indicando "Can única base en un estilo con el tipo de destino que es el tipo de base 'IFrameworkInputElement'."
Esto puede solucionarse poniendo TargetType="Hyperlink"
en la definición Style
inmediatamente dentro del elemento UserControl.Resources
. Sin embargo, mientras que los mensajes están siendo mostradas, la parte de enlace de ellos todavía tiene el estilo hipervínculo azul por defecto:
En pocas palabras, que no está funcionando, lo que daría la bienvenida a cualquier otro sugerencias/correcciones. :(
Actualización 2:
Gracias a una solución alternativa de Pavlo, ahora es trabajo :)
Awesome habilidades de google - gracias! Y una respuesta muy completa. Voy a probar esto y marcarlo como aceptado una vez que lo tenga funcionando. –
Olvidé que mi aplicación es una aplicación de WinForms que utiliza un 'ElementHost', por lo que no tengo un archivo app.xaml. Aún así, el principio parecía sólido, así que traté de agregar un 'MyDefaultHyperlinkStyle' vacío inmediatamente antes de' DataTemplate' en el diccionario de recursos de 'UserControl' y dejé el' StackPanel' específico que se muestra arriba para reemplazarlo con su propia definición. Lamentablemente, todavía no está funcionando. Seguiré intentando cosas ... –
@Mal - ¿Olvidaste incluir el estilo en la propia plantilla de datos: ' '? –