wpf 在MaterialDesign中选择后没有单元格边框的DataGrid

1hdlvixo  于 2023-02-05  发布在  其他
关注(0)|答案(3)|浏览(470)

我在我的WPF GUI中使用了一个datagrid,用户可以在其中双击一行来查看包含详细信息的页面(这很好用):

不幸的是,一个单元格的边框在一行中单击(一次)后会可见,尽管我已经使用了选择单元FullRow。我尝试了不同的选项,颜色等,但每次都显示边框。我尝试了How to suppress DataGrid cell selection的步骤,但它只是改变了datagrid的风格。

<DataGrid x:Name="DataGridMeasuringTasks" SelectionUnit="FullRow" Margin="20,145,0,44" 
   RowDetailsVisibilityMode="VisibleWhenSelected" CanUserAddRows="False"
   CanUserDeleteRows="False" HorizontalAlignment="Left" Width="1612" 
   SelectionMode="Single" IsReadOnly="True">
            
     <DataGrid.RowStyle>
         <Style TargetType="DataGridRow">
             <Setter Property="Background" Value="#FFF0F0F0" />
         </Style>
     </DataGrid.RowStyle>

     <DataGrid.Background>
         <SolidColorBrush Color="#FFF0F0F0"/>
     </DataGrid.Background>
</DataGrid>

如何删除边框?

irtuqstp

irtuqstp1#

此处定义了数据网格单元格的MaterialDesign样式。您必须复制并调整该样式,因为边框画笔的触发器将优先于本地值。请删除此部分。

<Trigger Property="IsKeyboardFocusWithin" Value="True">
    <Setter Property="BorderBrush" Value="{DynamicResource MaterialDesignTextBoxBorder}" />
</Trigger>

然后,将样式CellStyle分配给特定的DataGrid,或者将其移动到作用域中的资源字典,甚至是应用程序资源,以便自动将样式应用于作用域中的所有单元格。

<DataGrid x:Name="DataGridMeasuringTasks" SelectionUnit="FullRow" Margin="20,145,0,44" 
   RowDetailsVisibilityMode="VisibleWhenSelected" CanUserAddRows="False"
   CanUserDeleteRows="False" HorizontalAlignment="Left" Width="1612" 
   SelectionMode="Single" IsReadOnly="True">
   
     <DataGrid.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Padding" Value="{Binding RelativeSource={RelativeSource Self}, Path=(materialDesign:DataGridAssist.CellPadding)}" />
            <Setter Property="Background" Value="Transparent" />
            <Setter Property="BorderBrush" Value="Transparent" />
            <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
            <Setter Property="Foreground" Value="{Binding Foreground, RelativeSource={RelativeSource AncestorType=DataGridRow}}" />
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type DataGridCell}">
                        <Grid>
                            <Border
                                Background="{TemplateBinding Background}"
                                BorderBrush="{TemplateBinding BorderBrush}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                SnapsToDevicePixels="True" />
                            <ContentPresenter Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                        </Grid>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
            <Style.Triggers>
               <MultiDataTrigger>
                    <MultiDataTrigger.Conditions>
                        <Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True" />
                        <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource AncestorType=DataGridRow}}" Value="False" />
                    </MultiDataTrigger.Conditions>
                    <Setter Property="Background" Value="{DynamicResource MaterialDesignSelection}" />
                </MultiDataTrigger>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Opacity" Value=".56" />
                </Trigger>
            </Style.Triggers>
        </Style>
     </DataGrid.CellStyle>
            
     <DataGrid.RowStyle>
         <Style TargetType="DataGridRow">
             <Setter Property="Background" Value="#FFF0F0F0" />
         </Style>
     </DataGrid.RowStyle>

     <DataGrid.Background>
         <SolidColorBrush Color="#FFF0F0F0"/>
     </DataGrid.Background>
</DataGrid>
a8jjtwal

a8jjtwal2#

有一个更简单的答案:将数据网格的MaterialDesignTextBoxBorder设置为透明。

<DataGrid.Resources>
    <SolidColorBrush x:Key="MaterialDesignTextBoxBorder" Color="Transparent"/>
</DataGrid.Resources>

请注意,这只适用于只读数据网格。如果您的单元格是可编辑的,材料设计文本框下面的行将不会显示(但当您编辑特定单元格时,边框在我看来不是问题)。

nfzehxib

nfzehxib3#

有一种方法可以只覆盖边框样式而保留其他样式。我所做的是通过将BasedOn设置为MaterialDesignDataGridCell来创建一个样式,这样我仍然拥有MUI中的所有其他样式,然后我在我的样式中自定义了BorderBrushBorderThickness

<DataGrid.CellStyle>
    <Style TargetType="{x:Type DataGridCell}" BasedOn="{StaticResource MaterialDesignDataGridCell}">
        <Style.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="True">
                <Setter Property="BorderBrush" Value="Transparent" />
            </Trigger>
        </Style.Triggers>
        <Setter Property="BorderThickness" Value="0"/>
    </Style>
</DataGrid.CellStyle>

相关问题