【问题标题】:How to make a WPF DataGrid with alternating row colors, and a fix color section (ignoring alternation)如何制作具有交替行颜色和固定颜色部分的 WPF DataGrid(忽略交替)
【发布时间】:2012-07-11 14:58:14
【问题描述】:

我有一个数据网格,我试图使其类似于:

我正在使用AlternatingRowBackground 属性来执行交替颜色。对于固定颜色部分,我的 XAML 类似于:

            <DataGrid.Resources>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Path=ShouldBeFixedColor}" Value="True">
                            <DataTrigger.Setters>
                                <Setter Property="Background" Value="Blue" />
                            </DataTrigger.Setters>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </DataGrid.Resources>

这种方法的问题是“交替颜色”优先于固定颜色样式触发器。所以,底部不是蓝蓝蓝,而是蓝灰蓝。

关于如何存档所需颜色的任何想法?如果可能的话,我宁愿在 XAML 级别做这一切。

谢谢!

【问题讨论】:

    标签: wpf xaml user-interface


    【解决方案1】:

    根据其他 SO 答案进行了一些更改。希望这对将来的某人有所帮助。

    1. 从网格中拉出AlternatingRowBackground=...。加AlternationCount="2"
    2. 添加下面的块来做样式(手动做交替行)

              <DataGrid.RowStyle>
                  <Style TargetType="{x:Type DataGridRow}">
                      <Style.Triggers>
                          <Trigger Property="AlternationIndex" Value="0">
                              <Setter Property="Background" Value="White" />
                          </Trigger>
                          <Trigger Property="AlternationIndex" Value="1">
                              <Setter Property="Background" Value="WhiteSmoke" />
                          </Trigger>
                          <DataTrigger Binding="{Binding Path=Selectable}" Value="False">
                              <DataTrigger.Setters>
                                  <Setter Property="Background" Value="LightGray" />
                              </DataTrigger.Setters>
                          </DataTrigger>
                      </Style.Triggers>
                  </Style>
              </DataGrid.RowStyle>
      

    【讨论】:

    • 不错,干净的答案!只是添加一些进一步的细节:触发器的顺序在这里很重要。如果您将 DataTrigger 移到顶部,那么它将首先触发,但随后会被其中一个 AlernationIndex 触发器覆盖。
    • 谢谢。为我节省了很多时间。
    • @Andy 令人惊讶的是我在 9 年前写了这篇文章,它仍然很有帮助。从那以后,我已经忘记了所有有限的 WPF。很高兴有帮助
    【解决方案2】:

    如果其他人也在寻找在代码中完成的相同操作:

    Style rowStyle = new Style(typeof(DataGridRow));
    
    Trigger rowTrigger = new Trigger();
    rowTrigger.Property = DataGridRow.AlternationIndexProperty;
    rowTrigger.Value = 0;
    
    Setter rowSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Yellow);
    rowTrigger.Setters.Add(rowSetter);
    
    Trigger alternateRowTrigger = new Trigger();
    alternateRowTrigger.Property = DataGridRow.AlternationIndexProperty;
    alternateRowTrigger.Value = 1;
    
    Setter alternateRowSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Pink);
    alternateRowTrigger.Setters.Add(alternateRowSetter);
    
    DataTrigger rowDataTrigger = new DataTrigger();
    rowDataTrigger.Value = true;
    rowDataTrigger.Binding = new Binding() { Path = new PropertyPath(nameof(MyObject.IsSomethingTrue))};
    
    Setter backgroundSetter = new Setter(DataGridRow.BackgroundProperty, Brushes.Blue);
    Setter foregroundSetter = new Setter(DataGridRow.ForegroundProperty, Brushes.White);
    rowDataTrigger.Setters.Add(backgroundSetter);
    rowDataTrigger.Setters.Add(foregroundSetter);
    
    // the order of the triggers may not be changed as explained by CptCoathanger
    rowStyle.Triggers.Add(rowTrigger);
    rowStyle.Triggers.Add(alternateRowTrigger);
    rowStyle.Triggers.Add(rowDataTrigger);            
    
    RootDataGridOrders.RowStyle = rowStyle;
    

    【讨论】:

      猜你喜欢
      • 2012-06-10
      • 1970-01-01
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多