我在XAML中使用DataGrid
我为一个行上的鼠标悬停定义了一种特定的样式
这是通过<DataGrid.RowStyle>
标记的内容定义的。
对于特定列(最后一列),我想插入一个图标,该图标仅在鼠标悬停时可见。要将其隐藏在默认状态,我将前景颜色定义为透明,在<DataGridTextColumn.CellStyle>
标记内容中定义。
全球XAML下方
<DataGrid.Columns>
<!-- FIRST COLUMN DECLARATION -->
<DataGridTextColumn Binding="{Binding Container}" Header="Container" Width="*">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</DataGridTextColumn.ElementStyle>
</DataGridTextColumn>
<!-- ICON COLUMN DECLARATION -->
<DataGridTextColumn Binding="{Binding Icon}" Header="" Width="30" CanUserResize="False">
<DataGridTextColumn.ElementStyle>
<Style TargetType="TextBlock">
<Setter Property="VerticalAlignment" Value="Center" />
<Setter Property="HorizontalAlignment" Value="Left" />
</Style>
</DataGridTextColumn.ElementStyle>
<!-- DECLARE THE SPECIFIC TRANSPARENT COLOR -->
<DataGridTextColumn.CellStyle>
<Style TargetType="DataGridCell" >
<Setter Property="Foreground" Value="Transparent"/>
</Style>
</DataGridTextColumn.CellStyle>
</DataGridTextColumn>
</DataGrid.Columns>
<!-- MOUSEOVER ROW STYLE, which is not taken in account by second column -->
<DataGrid.RowStyle>
<Style TargetType="DataGridRow">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF27222A"/>
<Setter Property="Foreground" Value="#FF31A4CF" />
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
</DataGrid>
问题是单元格中定义的样式会覆盖行中定义的样式。鼠标悬停情况也是如此,这意味着我的触发器不会考虑该特定列(换句话说,最后一列的所有单元格)。
我试图用下面的TargetName声明一个Setter,但没有成功使它工作,主要是因为我不知道在项目中没有触发错误的情况下设置x:Name的位置。
<Setter Property="Foreground" Value="#FF31A4CF" TargetName="IconCol" />
任何建议都将不胜感激。
答案 0 :(得分:0)
确定。它有用,但部分失败,因为我最终引入了C#代码来处理Cell样式
我在<DataGrid.RowStyle>
标记中为MouseEnter和MouseLeave插入了一些 EventSetter
以下是XAML更新部分:
<DataGrid.RowStyle>
<Style TargetType="DataGridRow" BasedOn="{StaticResource BaseDataGridRowStyle}">
<EventSetter Event="MouseEnter" Handler="Row_MouseEnter"/>
<EventSetter Event="MouseLeave" Handler="Row_MouseLeave"/>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#FF27222A"/>
<Setter Property="Foreground" Value="#FF31A4CF" />
<Setter Property="FontWeight" Value="ExtraBold" />
<Setter Property="Cursor" Value="Hand"/>
</Trigger>
<Trigger Property="IsSelected" Value="True">
<Setter Property="Background" Value="#FF27222A" />
<Setter Property="Foreground" Value="#FF31A4CF" />
<Setter Property="FontWeight" Value="ExtraBold" />
</Trigger>
</Style.Triggers>
</Style>
</DataGrid.RowStyle>
然后,当事件被分派到C#代码时,我直接访问所需的单元格,以便在MouseOver情况下应用专用样式