J'ai une application WPF simple qui affiche les liens reddit dans un DataGrid
:
Notez cependant que le Le lien dans DataGridHyperlinkColumn
n'est pas visible lorsqu'une ligne est sélectionnée, en raison de la couleur du lien et de la couleur de la mise en évidence de la ligne.
Quelle est la bonne façon de résoudre ce problème ? Changer la couleur du texte du lien? Changer la couleur de surbrillance de la ligne?
Si possible, veuillez afficher votre suggestion en termes de code C # par opposition à XAML car cette application n'utilise pas XAML. Sinon, une solution XAML convient; Je vais simplement le convertir en C #. :-)
Pour référence, voici le code utilisé pour la colonne Title
:
var event_setter = new EventSetter() { Event = Hyperlink.ClickEvent, Handler = (RoutedEventHandler)((sender, e) => { System.Diagnostics.Process.Start((data_grid.SelectedItem as Link).Url); }) }; var style = new Style(); style.Setters.Add(event_setter); var hyperlink_column = new DataGridHyperlinkColumn() { Header = "Title", Binding = new Binding("Title"), ElementStyle = style, Width = 600 }; data_grid.Columns.Add(hyperlink_column);
5 Réponses :
La propriété Selector.IsSelected de la colonne DataGridHyperLink peut être utilisée et lorsque la sélection d'un élément particulier change, vous pouvez mettre à jour le style avec un déclencheur.
<DataGridHyperlinkColumn.CellStyle> <Style TargetType="{x:Type Hyperlink}"> <Setter Property="Foreground" Value="Blue"/> <Style.Triggers> <Trigger Property="Selector.IsSelected" Value="True"> <Trigger.Setters> <!--change the value for the property based on your needs--> <Setter Property="Foreground" Value="Yellow"/> </Trigger.Setters> </Trigger> </Style.Triggers> </Style> </DataGridHyperlinkColumn.CellStyle>
Ce n'est pas le Hyperlien
qui est sélectionné. C'est la ligne dans DataGrid
qui signifie que la liaison à Selector.IsSelected
ne résoudra pas le problème.
Vous pouvez ajouter un style implicite Hyperlink
à votre DataGrid
:
const string Xaml = "<Style TargetType=\"Hyperlink\" xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\">" + "<Style.Triggers>" + "<DataTrigger Binding=\"{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridCell}}\" Value=\"True\">" + "<Setter Property=\"Foreground\" Value=\"White\" />" + "</DataTrigger>" + "</Style.Triggers>" + "</Style>"; data_grid.Resources.Add(typeof(Hyperlink), System.Windows.Markup.XamlReader.Parse(Xaml) as Style); data_grid.Columns.Add(hyperlink_column);
J'ai ajouté une réponse basée sur la vôtre qui illustre la même approche mais convertie de XAML en C #.
Voici une version de la réponse fournie par @ mm8 convertie de XAML en C #:
var data_trigger = new DataTrigger() { Binding = new Binding() { Path = new PropertyPath("IsSelected"), RelativeSource = new RelativeSource() { AncestorType = typeof(DataGridCell) } }, Value = true }; data_trigger.Setters.Add(new Setter(ForegroundProperty, new SolidColorBrush(Colors.White))); var style = new Style(typeof(Hyperlink)); style.Triggers.Add(data_trigger); data_grid.Resources.Add(typeof(Hyperlink), style);
Voici une version de la réponse fournie par @ mm8 convertie de XAML en C # qui utilise des méthodes d'extension pour éviter les variables intermédiaires: data_grid.Resources.Add(
typeof(Hyperlink),
new Style(typeof(Hyperlink))
.AddTrigger(
new DataTrigger()
{
Binding = new Binding()
{
Path = new PropertyPath("IsSelected"),
RelativeSource = new RelativeSource() { AncestorType = typeof(DataGridCell) }
},
Value = true
}
.AddSetter(new Setter(ForegroundProperty, new SolidColorBrush(Colors.White)))));
Solution XAML pure:
<DataGrid> <DataGrid.Resources> <Style TargetType="{x:Type Hyperlink}"> <Style.Triggers> <DataTrigger Binding="{Binding IsSelected, RelativeSource={RelativeSource AncestorType=DataGridCell}}" Value="True"> <DataTrigger.Setters> <Setter Property="Foreground" Value="Yellow"/> </DataTrigger.Setters> </DataTrigger> </Style.Triggers> </Style> </DataGrid.Resources> <DataGrid.Columns> <DataGridHyperlinkColumn Width="180" Header="Url" Binding="{Binding Path=Uri, Mode=OneWay}" /> </DataGrid.Columns> </DataGrid>
pouvez également publier le code XAML pour datagrid