C# 动态更改Wpf DatagridTemplateColumn的边框笔刷颜色
在我的wpf项目中,我制作了一个C# 动态更改Wpf DatagridTemplateColumn的边框笔刷颜色,c#,wpf,imultivalueconverter,C#,Wpf,Imultivalueconverter,在我的wpf项目中,我制作了一个IMultiValueConverter,它将改变DataGridCells的前景,如下所示: class CellForegroundMultiValueConverter : IMultiValueConverter { #region Implementation of IMultiValueConverter /// <inheritdoc /> public object Convert(object[] value
IMultiValueConverter
,它将改变DataGridCells的前景,如下所示:
class CellForegroundMultiValueConverter : IMultiValueConverter
{
#region Implementation of IMultiValueConverter
/// <inheritdoc />
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
var columnHeader = values[0] as string;
var dataItem = values[1] as Task;
if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
&& dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("Proxy"))
{
if(dataItem.Proxy)
{
return Brushes.LightGreen;
}
return mainred;
}
return Brushes.White;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();
#endregion
}
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
...
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
<DataGridTemplateColumn.HeaderStyle>
<Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Padding" Value="20"/>
<!--<Setter Property="Height" Value="57"/>-->
<Setter Property="BorderBrush">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
<Border.Style>
<Style TargetType="Border">
</Style>
</Border.Style>
<TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
class CellForeGround多值转换器:IMultiValueConverter
{
#IMultiValueConverter的区域实现
///
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
SolidColorBrush mainred=新的SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
var columnHeader=值[0]作为字符串;
var dataItem=作为任务的值[1];
if(columnHeader.Equals(“Status”,StringComparison.OrdinalIgnoreCase)
&&dataItem.Status.Equals(“Success!”,StringComparison.OrdinalIgnoreCase))
{
返回mainred;
}
if(columnHeader.Equals(“#”,StringComparison.OrdinalIgnoreCase))
{
返回mainred;
}
if(columnHeader.Equals(“代理”))
{
if(dataItem.Proxy)
{
返回笔刷。浅绿色;
}
返回mainred;
}
返回刷。白色;
}
公共对象[]ConvertBack(对象值,类型[]targetTypes,对象参数,CultureInfo区域性)=>抛出新的NotSupportedException();
#端区
}
它链接到我的DataGrid,如下所示:
class CellForegroundMultiValueConverter : IMultiValueConverter
{
#region Implementation of IMultiValueConverter
/// <inheritdoc />
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
var columnHeader = values[0] as string;
var dataItem = values[1] as Task;
if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
&& dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("Proxy"))
{
if(dataItem.Proxy)
{
return Brushes.LightGreen;
}
return mainred;
}
return Brushes.White;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();
#endregion
}
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
...
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
<DataGridTemplateColumn.HeaderStyle>
<Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Padding" Value="20"/>
<!--<Setter Property="Height" Value="57"/>-->
<Setter Property="BorderBrush">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
<Border.Style>
<Style TargetType="Border">
</Style>
</Border.Style>
<TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
...
我有一个DataGridTemplate列,显示DataGrid中的项目数,如下所示:
class CellForegroundMultiValueConverter : IMultiValueConverter
{
#region Implementation of IMultiValueConverter
/// <inheritdoc />
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
SolidColorBrush mainred = new SolidColorBrush(System.Windows.Media.Color.FromRgb(223,70,75));
var columnHeader = values[0] as string;
var dataItem = values[1] as Task;
if( columnHeader.Equals("Status", StringComparison.OrdinalIgnoreCase)
&& dataItem.Status.Equals("Success!", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("#", StringComparison.OrdinalIgnoreCase))
{
return mainred;
}
if( columnHeader.Equals("Proxy"))
{
if(dataItem.Proxy)
{
return Brushes.LightGreen;
}
return mainred;
}
return Brushes.White;
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) => throw new NotSupportedException();
#endregion
}
<DataGrid.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
...
<Setter Property="Foreground">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGrid.CellStyle>
<DataGridTemplateColumn Width="*" Header="#" MaxWidth="60">
<DataGridTemplateColumn.HeaderStyle>
<Style BasedOn="{StaticResource MaterialDesignDataGridColumnHeader}" TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</DataGridTemplateColumn.HeaderStyle>
<DataGridTemplateColumn.CellStyle>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="Padding" Value="20"/>
<!--<Setter Property="Height" Value="57"/>-->
<Setter Property="BorderBrush">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
</DataGridTemplateColumn.CellStyle>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Border Background="#262626" CornerRadius="5,5,5,5" BorderThickness="2" BorderBrush="{Binding StatusColour}">
<Border.Style>
<Style TargetType="Border">
</Style>
</Border.Style>
<TextBlock Text="{Binding NumberOTasks}" FontWeight="Bold" HorizontalAlignment="Center" VerticalAlignment="Center" FontSize="15" Foreground="#E43D47"/>
</Border>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
如果我将
IMultiValueConverter
放在DataGridTemplateColumn.CellStyle
中,它会工作并为边框添加颜色,但它不受边框的拐角半径的影响,但如果我将其放在边框样式中,它将不工作,并显示列标题为=null。如何更改边界笔刷,使其受边界角半径的影响?您可以为每列设置单元格样式,或基于值使用全局单元格样式:
<DataGrid xmlns:system="clr-namespace:System;assembly=mscorlib">
<DataGrid.Resources>
<Style TargetType="DataGridCell">
<Style.Triggers>
<DataTrigger Binding="{Binding}"
Value="Proxy">
<Setter Property="Foreground"
Value="LightGreen" />
<Setter Property="BorderBrush"
Value="LightGreen" />
</DataTrigger>
<DataTrigger Binding="{Binding}"
Value="#">
<Setter Property="Foreground"
Value="Gray" />
<Setter Property="BorderBrush"
Value="Red" />
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.Resources>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding}"
Header="#" />
<DataGridTextColumn Binding="{Binding}"
Header="Proxy" />
<DataGridTextColumn Binding="{Binding}"
Header="Status">
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Foreground"
Value="Blue" />
<Setter Property="BorderBrush"
Value="Blue" />
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<system:String>Proxy</system:String>
<system:String>#</system:String>
<system:String>Success</system:String>
</DataGrid>
代理
#
成功
结果应该如下所示:要更改内部网格边框,您需要覆盖
DataGridCell
的默认模板,并从中修改边框属性。请记住,有两个模板用于ContentControl
:一个ControlTemplate
用于ContentControl
本身(例如ListBoxItem
或DataGridCell
),另一个DataTemplate
用于ContentControl
的内容
<DataGridTemplateColumn.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Background" Value="#262626">
<Setter Property="BorderBrush">
<Setter.Value>
<MultiBinding>
<MultiBinding.Converter>
<local:CellForegroundMultiValueConverter />
</MultiBinding.Converter>
<Binding RelativeSource="{RelativeSource Self}" Path="Column.Header"/>
<Binding/>
<Binding Path="HasChanges" />
</MultiBinding>
</Setter.Value>
</Setter>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="DataGridCell">
<Border BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}"
CornerRadius="5">
<ContentPresenter />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</DataGridTemplateColumn.CellStyle>
要更改
数据网格的内部网格单元格边框还是单元格内容的边框