2
votes

Couleur du texte DataGridHyperlinkColumn lorsqu'il est mis en surbrillance

J'ai une application WPF simple qui affiche les liens reddit dans un DataGrid :

entrez la description de l'image ici

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);


1 commentaires

pouvez également publier le code XAML pour datagrid


5 Réponses :


1
votes

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>


1 commentaires

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.



2
votes

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);


1 commentaires

J'ai ajouté une réponse basée sur la vôtre qui illustre la même approche mais convertie de XAML en C #.



0
votes

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);


0 commentaires


1
votes

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>


0 commentaires