突出显示时DataGridHyperlinkColumn的文本颜色

时间:2019-04-04 22:28:21

标签: c# wpf datagrid

我有一个简单的WPF应用程序,它在DataGrid中显示reddit链接:

enter image description here

但是请注意,由于链接的颜色和行突出显示的颜色,选择行时DataGridHyperlinkColumn中的链接不可见。

什么是解决此问题的好方法?更改链接文字颜色?更改行突出显示颜色吗?

如果可能,请以C#代码(而非XAML)显示您的建议,因为此应用程序未使用XAML。否则,可以使用XAML解决方案。我将其转换为C#。 :-)

作为参考,这是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 个答案:

答案 0 :(得分:2)

您可以在Hyperlink中添加隐式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 :(得分:1)

可以使用DataGridHyperLink Column的Selector.IsSelected属性,并且当特定项目上的选择更改时,可以使用触发器更新样式。

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

答案 2 :(得分:0)

这是@ mm8提供的答案的一个版本,已从XAML转换为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);

答案 3 :(得分:0)

这是@ mm8提供的答案的一个版本,它从XAML转换为C#,它使用一些extension methods来避免中间变量:

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

答案 4 :(得分:0)

纯XAML解决方案:

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