【问题标题】:WPF datagrid row strikethroughWPF 数据网格行删除线
【发布时间】:2023-03-21 22:37:01
【问题描述】:

我正在使用 WPF Datagrid,我想有条件地删除, 就像我下面的代码适用于斜体一样,我想用删除线替换斜体。 Property="TextBlock.TextDecorations" Value="Strikethrough" 没有帮助。我在数据网格中有 5 个文本列和 1 个模板列。

    <Style x:Key="abcRowStyle" TargetType="{x:Type DataGridRow}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding IsActive}" Value="false" >
                <Setter Property="FontStyle" Value="Italic" />
            </DataTrigger>
        </Style.Triggers>
    </Style>

【问题讨论】:

    标签: .net wpf xaml wpfdatagrid


    【解决方案1】:

    我在文本块上使用了以下内容,然后将其应用于各个文本列,这很有效。并且有条件地在 datagridrow 上附加了 opacity = .5 。看起来不错!

       <Style x:Key="RightAlignStyle" TargetType="{x:Type TextBlock}">
            <Setter Property="TextAlignment" Value="Right" />
            <Setter Property="Padding" Value="5,0"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsActive}" Value="false">
                    <Setter Property="TextDecorations" Value="Strikethrough" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <Style x:Key="DefaultStyle" TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsActive}" Value="false">
                    <Setter Property="TextDecorations" Value="Strikethrough" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    

    【讨论】:

    • 当我尝试这个时,我得到“'TextBlock' TargetType 与元素'DataGridCell'的类型不匹配。”例外。您能否说明如何修改 DataGridTextColumn 上的 textdecoration
    • @conceptacid 我通过将以下内容添加到 DataGridTextColumn 来使其工作:ElementStyle="{StaticResource DefaultStyle}
    【解决方案2】:

    看到这个问题:WPF DataGrid, cross out the row

    更新
    修改了链接中的样式,改为删除线

    <DataGrid ...>
        <DataGrid.RowStyle>
            <Style TargetType="{x:Type DataGridRow}">
                <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.WindowBrushKey}}"/>
                <Setter Property="SnapsToDevicePixels" Value="true"/>
                <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
                <Setter Property="ValidationErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <TextBlock Foreground="Red" Margin="2,0,0,0" Text="!" VerticalAlignment="Center"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type DataGridRow}">
                            <Border x:Name="DGR_Border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
                                <SelectiveScrollingGrid>
                                    <SelectiveScrollingGrid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition Width="*"/>
                                    </SelectiveScrollingGrid.ColumnDefinitions>
                                    <SelectiveScrollingGrid.RowDefinitions>
                                        <RowDefinition Height="*"/>
                                        <RowDefinition Height="Auto"/>
                                    </SelectiveScrollingGrid.RowDefinitions>
                                    <DataGridCellsPresenter Grid.Column="1" ItemsPanel="{TemplateBinding ItemsPanel}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                    <DataGridDetailsPresenter Grid.Column="1" Grid.Row="1" SelectiveScrollingGrid.SelectiveScrollingOrientation="{Binding AreRowDetailsFrozen, ConverterParameter={x:Static SelectiveScrollingOrientation.Vertical}, Converter={x:Static DataGrid.RowDetailsScrollingConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" Visibility="{TemplateBinding DetailsVisibility}"/>
                                    <DataGridRowHeader Grid.RowSpan="2" SelectiveScrollingGrid.SelectiveScrollingOrientation="Vertical" Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Row}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}"/>
                                    <Path Name="cross" Grid.ColumnSpan="2" Visibility="Collapsed" Data="M0,0.5 L1,0.5" Stretch="Fill" Stroke="Black" StrokeThickness="1" />
                                </SelectiveScrollingGrid>
                            </Border>
                            <ControlTemplate.Triggers>
                                <DataTrigger Binding="{Binding IsActive}" Value="False">
                                    <Setter TargetName="cross" Property="Visibility" Value="Visible"/>
                                </DataTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </DataGrid.RowStyle>
        <!--...-->
    </DataGrid>
    

    【讨论】:

      【解决方案3】:

      您是否尝试过添加显式 TextDecorationCollection?

      【讨论】:

      • @WholsNinja,没什么好遗憾的。很抱歉之前发布了错误的答案...