WPF DataGrid行着色

时间:2016-06-27 22:41:55

标签: wpf xaml colors visual-studio-2015 wpfdatagrid

我有一个datagrid,其中行可能具有颜色代码的状态或要求它们加粗的数据。我已经能够轻松地进行大胆工作了。如果它有颜色代码,我希望整个行背景以该颜色显示。我搜索了几个网站并尝试了许多不同的方法来获得行颜色编码,但它们似乎都没有工作。我错过了什么?
Datagrid.xaml(样式):

<Style TargetType="{x:Type DataGridRow}">
        <Setter Property="Background" Value="#FFFFFF" />
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="Validation.ErrorTemplate" Value="{x:Null}" />
        <Setter Property="ValidationErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <TextBlock Margin="2,0,0,0"
                               VerticalAlignment="Center"
                               Foreground="Red"
                               Text="!" />
                </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}"
                            SnapsToDevicePixels="True">
                        <Border.Background>
                            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                                <GradientStop Offset="0" Color="#AAFFFF" />
                                <GradientStop Offset="1" Color="#AAFFD4" />
                            </LinearGradientBrush>
                        </Border.Background>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal_AlternatingRow">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFFF" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#E6F7FF" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Normal_Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#2e90d1" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#2980b9" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="MouseOver">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[0].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFFE6" />
                                        </ColorAnimationUsingKeyFrames>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="DGR_Border" Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="#FFFF80" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <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.Row="1"
                                                      Grid.Column="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}}}" />
                        </SelectiveScrollingGrid>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <Trigger Property="IsSelected" Value="True">
                <Setter Property="Foreground" Value="White" />
            </Trigger>
        </Style.Triggers>
    </Style>
    <Style TargetType="{x:Type DataGridCell}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type DataGridCell}">
                    <Border x:Name="border"
                            Background="Transparent"
                            BorderBrush="Transparent"
                            BorderThickness="1"
                            SnapsToDevicePixels="True">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="FocusStates">
                                <VisualState x:Name="Unfocused" />
                                <VisualState x:Name="Focused" />
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="CurrentStates">
                                <VisualState x:Name="Regular" />
                                <VisualState x:Name="Current">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="border" Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="Gray" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

ListManager.xaml(表单):

<DataGrid 
                              SelectedItem="{Binding SelectedLead, Mode=TwoWay}" 
                              ItemsSource="{Binding LeadListFiltered}" 
                              x:Name="grdWorkLeadList"
                              AutoGenerateColumns="False"
                              Margin="-10,8,2,0"
                              IsReadOnly="True"
                              AlternationCount="2"
                        SelectionChanged="grdWorkLeadList_SelectionChanged"
                        LoadingRow="grdWorkLeadList_LoadingRow">
                        <DataGrid.Columns>
                            <DataGridTextColumn Header="Campaign" Binding="{Binding SetupCampaign.Name}" />
                            <DataGridTextColumn Header="Action Status" Binding="{Binding ActionStatus}" />
                            <DataGridTextColumn Header="Action Date" Binding="{Binding ActionDate,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTemplateColumn Header="Name" SortMemberPath="Lastname">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock>
                                            <Run Text="{Binding Title }" />
                                            <Run Text=" " />
                                            <Run Text="{Binding Firstname }" />
                                            <Run Text=" " />
                                            <Run Text="{Binding Lastname }" />
                                        </TextBlock>
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>
                            </DataGridTemplateColumn>
                            <DataGridTextColumn Header="Product" Binding="{Binding Product  }" />
                            <DataGridTextColumn Header="Sailing" Binding="{Binding Sailing,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Stateroom" Binding="{Binding Stateroom  }" />
                            <DataGridTextColumn Header="Booking Date" Binding="{Binding BookingDate,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Cancel Date" Binding="{Binding CancelDate,StringFormat=\{0:MM dd yyyy\}}"  />
                            <DataGridTextColumn Header="Disposition" Binding="{Binding DispositionValue}" />
                            <DataGridTextColumn Header="Booking" Binding="{Binding Booking  }" />
                            <DataGridTextColumn Header="Run Date" Binding="{Binding RunDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Phone" Binding="{Binding Phone  }" />
                            <DataGridTextColumn Header="Followup" Binding="{Binding ActionFollowup}" />
                            <DataGridTextColumn Header="ID" Binding="{Binding ID    }" />
                            <DataGridTextColumn Header="Assigned Agent" Binding="{Binding AssignedAgent }" />
                            <DataGridTextColumn Header="Active" Binding="{Binding ActiveStatus  }" />
                            <DataGridTextColumn Header="Disposition Date" Binding="{Binding DispositionDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Rebook #" Binding="{Binding ReBookNumber    }" />
                            <DataGridTextColumn Header="Close Date" Binding="{Binding CloseDate ,StringFormat=\{0:MM dd yyyy\}}" />
                            <DataGridTextColumn Header="Reason" Binding="{Binding ReasonDescription}" />
                            <DataGridTextColumn Header="Code" Binding="{Binding Code    }" />
                        </DataGrid.Columns>
                    </DataGrid>

代码隐藏(cs):

private void grdWorkLeadList_LoadingRow(object sender, DataGridRowEventArgs e)
{
    Lead item = e.Row.Item as Lead;

    string color;
    if (item != null)
    {
        //handle status colors
        if (item.CurrentDisposition != null)
            using (var db = new DAOutboundCM_DEVEntities())
            {
                color = (from d in db.SetupDispositionLists where d.ID == item.CurrentDisposition select d.Color).Single();
                e.Row.Background = new SolidColorBrush((Color) ColorConverter.ConvertFromString(color));
                e.Row.UpdateLayout();

            }

        //handle priority bolding
        if (item.SetupCampaign.Name.Contains("Quotes"))
            if (item.Phone != null && item.Phone != "")
                e.Row.FontWeight = FontWeights.Bold;
    }
}

1 个答案:

答案 0 :(得分:0)

在WPF中,最好只设置一次属性,否则可能会出现意外行为。我猜测为什么粗体工作和着色不是因为虽然你已经在后面的代码中设置了两个,但你也在样式中设置了背景颜色。

当您删除样式中的setter时问题是否仍然存在?

<Setter Property="Background" Value="#FFFFFF"/>

修改

您似乎无法在后面的代码中指定背景颜色,因为您尚未在模板中实现Background属性。

prop="{TemplateBinding Background}"

进一步深入研究表明,您还在代码中设置了三次背景。

  1. 您已经删除的虚线
  2. 加载行时的代码
  3. 通过模板化VisualStates行背景
  4. 要查看您的代码是否有效,您可以

    替换

    <Border x:Name="DGR_Border"
            BorderBrush="{TemplateBinding Background}"
            BorderThickness="{TemplateBinding BorderThickness}"
            SnapsToDevicePixels="True">
        <Border.Background>
            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                <GradientStop Offset="0" Color="#AAFFFF" />
                <GradientStop Offset="1" Color="#AAFFD4" />
            </LinearGradientBrush>
        </Border.Background>
    

    <Border x:Name="DGR_Border"
            BorderBrush="{TemplateBinding Background}"
            BorderThickness="{TemplateBinding BorderThickness}"
            SnapsToDevicePixels="True"
            Background="{TemplateBinding Background}">
    

    并注释掉你的

    <!--<VisualStateManager.VisualStateGroups>
        ...
    </VisualStateManager.VisualStateGroups>-->
    
    在DataGridRow ControlTemplate中