Не могу изменить передний план в DataGrid - PullRequest
0 голосов
/ 28 февраля 2020

Я создал DataGrid и поместил фон в би прозрачный. Теперь я хочу установить синий цвет переднего плана, но он не хочет меняться, всегда черный. Я пытаюсь поставить Foreground = "Blue" во всех этих местах, но никогда не работал.

<DataGrid Background="Transparent" Foreground="Blue">
        <DataGrid.Columns Foreground="Blue">
            <DataGridTextColumn Foreground="Blue" Header="AAA"/>
            <DataGridTextColumn Foreground="Blue" Header="BBB"/>
            <DataGridTextColumn Foreground="Blue" Header="CCC"/>
            <DataGridTextColumn Foreground="Blue" Header="DDD"/>
        </DataGrid.Columns>
    </DataGrid>

У меня есть это в моем App.xaml , так что, возможно, есть некоторые темы, которые влияют на него, но я не знаю, как его перезаписать.

<ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Light.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesignTheme.Defaults.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Primary/MaterialDesignColor.Blue.xaml" />
            <ResourceDictionary Source="pack://application:,,,/MaterialDesignColors;component/Themes/Recommended/Accent/MaterialDesignColor.Indigo.xaml" />
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Вам нужно добавить некоторые данные в сетку данных, чтобы увидеть, что делает ваш код:

<Window x:Class="WpfApp1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp1"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
  <Window.Resources>
    <XmlDataProvider x:Key="MockList"   XPath="/MockObjects/*" >
      <x:XData >
        <MockObjects xmlns="">
          <MockObject  Name="Louis" Type="TTTT" Number="1" />
          <MockObject Name="Joseph" Type="TTTT" Number="2" />
          <MockObject Name="Papineau" Type="ZZZZ" Number="3" />
        </MockObjects>
      </x:XData>
    </XmlDataProvider>
  </Window.Resources>
  <Grid DataContext="{Binding Source={StaticResource MockList}}">
    <DataGrid Background="Transparent" Name="MainDataGrid" 
              ItemsSource="{Binding Mode=Default, XPath=/MockObjects/MockObject}" 
              AutoGenerateColumns="False">
      <DataGrid.Columns>
        <DataGridTextColumn Foreground="Blue" Header="AAA" Binding="{Binding XPath=@Name}" />
        <DataGridTextColumn Foreground="Blue" Header="BBB" Binding="{Binding XPath=@Type}"/>
        <DataGridTextColumn Foreground="Blue" Header="CCC" Binding="{Binding XPath=@Number}"/>
        <DataGridTextColumn Foreground="Blue" Header="DDD"/>
      </DataGrid.Columns>
    </DataGrid>
  </Grid>
</Window>

Кажется, что DataGridTextColumn Foreground устанавливает передний план данных, а не заголовок.

Кажется, что заголовок наследует свой передний план от DataGrid.Foreground. Сделайте следующее изменение в моем коде:

<DataGrid Background="Transparent" Name="MainDataGrid" Foreground="Blue"

Чтобы исследовать, как работает наследование значений (или если значение происходит из шаблона) Установите точку останова в вашей программе:

Запустите программу и дважды щелкните по сетке данных. QuickWatch MainDataGrid и откройте WPF Tree Visualizer

enter image description here

В TextBlock отображается столбец текст заголовка Он наследует синий цвет переднего плана от всех линий, отмеченных желтым. Только MainDataGrid не наследует значение, но задается локально в XAML. Treeview дает вам эту информацию, если вы щелкнете по MainDataGrid Foreground.

Примечание. Эта строка в вашем коде не компилируется

<DataGrid.Columns Foreground="Blue">

DataGrid.Columns не имеет свойства Foreground.

Хорошо известно, что правильная работа форматирования WPF DataGrid - это большая головная боль. Я рекомендую вам прочитать мою статью о codeproject Руководство по форматированию сетки данных WPF с использованием привязок , чтобы увидеть примеры для всех видов форматирования сетки данных.

1 голос
/ 29 февраля 2020

По какой-то причине, которая не работает в моем проекте, есть некоторая тема, примененная и перезаписываемая везде, где я размещаю Foreground. То, что я сделал, это поместил в DataGridTextColumn.Header Label и сел Foreground of Label, и это сработало. И я сделал это для каждого DataGridTextColumn в моей DataGrid

<DataGridTextColumn Binding="{Binding Name}" IsReadOnly="True" Width="Auto" >
                <DataGridTextColumn.Header>
                    <Label Foreground="#FF0398E2" FontWeight="Bold" FontSize="16">Name</Label>
                </DataGridTextColumn.Header>
            </DataGridTextColumn>
1 голос
/ 28 февраля 2020

Проблема в том, что шаблон применяется к каждой из ячеек, и wpf не всегда наследуется в шаблон, сгенерированный пользовательским интерфейсом.

Вы можете попробовать вставить это в свою сетку данных:

 <DataGrid.CellStyle>
      <Style TargetType="DataGridCell">
           <Setter Property="TextElement.Foreground" Value="Blue" />
      </Style>
 </DataGrid.CellStyle>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...