我需要转移到Windows窗体应用程序的wpf。我在为Wpf DataGrid制作相同风格的DataGridView时遇到了一些问题。
DataGridView通过DataSource属性填充List。
public class GameItem
{
public string Name { get; set; }
public bool Selected { get; set; }
}
当选择= True时,DGV上的整行为红色,否则为GreenYellow。 SelectionColor始终与标准颜色相同,因此在行之间移动不会改变任何颜色。
这是DefaultCellStyle:
dataGridViewCellStyle4.BackColor = System.Drawing.Color.GreenYellow;
dataGridViewCellStyle4.ForeColor = System.Drawing.SystemColors.ControlText;
dataGridViewCellStyle4.SelectionBackColor = System.Drawing.Color.GreenYellow;
dataGridViewCellStyle4.SelectionForeColor = System.Drawing.SystemColors.ControlText;
void dgvDetail_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
if (e.RowIndex >= 0)
{
var gameItem = (sender as DataGridView).Rows[e.RowIndex].DataBoundItem as GameItem;
if (gameItem != null && gameItem.Selected)
{
e.CellStyle.SelectionForeColor = Color.White;
e.CellStyle.SelectionBackColor = Color.Red;
e.CellStyle.ForeColor = Color.White;
e.CellStyle.BackColor = Color.Red;
}
}
}
这是wpf应用程序中Grid的定义:
<Window x:Class="TestGrid.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:TestGrid"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red"/>
<Style TargetType="DataGrid">
<Style.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="Red"/>
</Style.Resources>
<Setter Property="FontSize" Value="10pt" ></Setter>
<Setter Property="FontFamily" Value="Microsoft Sans Serif" ></Setter>
<Setter Property="FontWeight" Value="Bold" ></Setter>
<Setter Property="SelectionUnit" Value="FullRow" ></Setter>
<Setter Property="HeadersVisibility" Value="Row" ></Setter>
<Setter Property="AutoGenerateColumns" Value="False" ></Setter>
</Style>
</Window.Resources>
<Grid>
<DataGrid Name="dg1">
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="GreenYellow"></Setter>
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="True">
<Setter Property="Background" Value="Red"/>
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Description" Binding="{Binding Description}" Width="Auto" />
<DataGridTextColumn Header="Manufacturer" Binding="{Binding Manufacturer}" Width="*" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
我有这个问题:
在wpf我不明白如何将行指示箭头显示在行标题中。
在wpf中当用户点击一个被选中并改变颜色的行时,我不想要这个行为。我想只有当有界的Selected item属性为true时,一行才是红色的。因此,单击一行不能改变颜色,背景颜色必须保持绿色,前景白色在数据源中为Selected = false。
这是Windows窗体版本:
这是wpf,第1行和第3行被正确绘制,因为绑定项目具有Selected = True。问题是当单击一行时(图中的1943),即使Selected为false,它也会突出显示,我想避免活动行突出显示为窗体版本。
答案 0 :(得分:0)
禁用鼠标选择上的红色高亮显示删除HighlightBrushKey资源(或至少更改颜色以查看差异)
更改行标题为DataGridRowHeader类型创建样式:
<Style TargetType="{x:Type DataGridRowHeader}" BasedOn="{StaticResource {x:Type DataGridRowHeader}}">
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="BorderThickness" Value="0,0,1,1"/>
<Setter Property="Background" Value="GreenYellow"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
<Trigger Property="IsRowSelected" Value="True">
<Setter Property="Content" Value="▸"/>
<Setter Property="Background" Value="{StaticResource {x:Static SystemColors.HighlightBrushKey}}"/>
</Trigger>
</Style.Triggers>
</Style>
当Selected属性为true时,行标题为红色,否则为GreenYellow。当使用输入选择行时,它会显示黑色右指向小三角形字符。
或者甚至隐藏行标题并使用DataGridTemplateColumn而不是选定的单元格将显示>
修改了行和单元格样式以更改选择前景
<DataGrid.RowStyle>
<Style TargetType="{x:Type DataGridRow}">
<Setter Property="Background" Value="GreenYellow"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="True">
<Setter Property="Background" Value="Red"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="Foreground" Value="Black"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Selected}" Value="True">
<Setter Property="Foreground" Value="White"/>
</DataTrigger>
</Style.Triggers>
</Style>
</DataGrid.CellStyle>