2013-02-27 3 views
0

У меня есть приложение WPF, который использует DataGrid управления и используется сотрудниками полиции в полицейских автомобилях. Я использую объединенные словари для реализации режимов «День» и «Ночь», когда цветовая палитра изменяется при переключении программы между ними. Приложение собирает данные с специальных датчиков, которые производит моя компания, и отображает их для офицеров (офицеров).Фоновая свойство DataGridRow неправильно

DataGrid в вопросе ведет себя странно. Первоначально он пуст, когда программа запускается впервые. По мере сбора данных строки добавляются к DataGrid. Когда вы запускаете программу, она изначально находится в режиме «День». Проблема в том, что фон первой строки не изменяется на цвет ночного режима для элемента управления. Он остается белым, это цвет в дневном режиме. Если вы переключаетесь между дневным и ночным режимами, он остается белым.

Это отличается от любых строк, которые добавляются к DataGrid после этого, которые имеют правильный цвет и правильно переключаются между цветами.

Вот стиль я определил в моем App.xaml для DataGridRow класса:

<Application x:Class="MyApplication.App" 
    . . .> 

    <Application.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="pack://application:,,,/MyApplication;component/DayTime.xaml" /> 

       <ResourceDictionary> 
        . . . 
        <Style TargetType="{x:Type DataGridRow}"> 
        <Setter Property="BorderBrush"  Value="{DynamicResource DataBorder}" /> 
        <Setter Property="Background"  Value="{DynamicResource DataBackground}" /> 
        <Setter Property="Foreground"  Value="{DynamicResource DataForeground}" /> 
       <Style.Triggers> 
        <Trigger Property="IsFocused" Value="True"> 
         <Setter Property="Background" Value="{DynamicResource DataBackground}" /> 
         <Setter Property="BorderBrush" Value="{DynamicResource DataBorderFocused}" /> 
         <Setter Property="Foreground" Value="{DynamicResource DataForeground}" /> 
        </Trigger> 
        <Trigger Property="IsKeyboardFocused" Value="True"> 
         <Setter Property="Background" Value="{DynamicResource DataBackground}" /> 
         <Setter Property="BorderBrush" Value="{DynamicResource DataBorderFocused}" /> 
         <Setter Property="Foreground" Value="{DynamicResource DataForeground}" /> 
        </Trigger> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="Background" Value="{DynamicResource DataBackgroundSelected}" /> 
         <Setter Property="BorderBrush" Value="{DynamicResource DataBorderSelected}" /> 
         <Setter Property="Foreground" Value="{DynamicResource DataForegroundSelected}" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
      . . . 
       </ResourceDictionary> 
      </ResourceDictionary> 
     </ResourceDictionary> 
    </Application.Resources> 
</Application> 

Когда я бегу Snoop по программе и перейти к DataGridRow в вопросе, значение Background свойства равно белый (#FFFFFFFF), а для источника значения для него установлено значение «DefaultStyle». Однако это не похоже на стиль, который я определил, поскольку он не меняется, когда я переключаюсь в дневной режим & обратно в белый цвет. Я думаю, что это стиль по умолчанию, определенный Microsoft, и он не использует мой стиль вообще. Но только в первой строке, вставленной в DataGrid, если она была изначально пустой.

Для последующих строк, столбец Значение Источник читает «ParentTemplate». Это должен быть мой стиль, поскольку цвета фона меняются правильно, когда вы переключаете ночной режим.

Как это исправить, так что каждая строка в DataGrid правильно?

EDIT:

В интересах полноты, вот стиль, используемый элементом управления DataGrid, в случае, если это помогает.

<Style TargetType="{x:Type DataGrid}"> 
    <Setter Property="Background"     Value="{DynamicResource DataBackground}" /> 
    <Setter Property="Foreground"     Value="{DynamicResource TextForeground}" /> 
    <Setter Property="BorderBrush"     Value="{DynamicResource DataBorder}" /> 
    <Setter Property="BorderThickness"    Value="1" /> 
    <Setter Property="RowDetailsVisibilityMode"  Value="VisibleWhenSelected" /> 
    <Setter Property="ScrollViewer.CanContentScroll" Value="true" /> 
    <Setter Property="ScrollViewer.PanningMode"  Value="Both" /> 
    <Setter Property="Stylus.IsFlicksEnabled"  Value="False" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type DataGrid}"> 
       <Border BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         Background="{TemplateBinding Background}" 
         Padding="{TemplateBinding Padding}" 
         SnapsToDevicePixels="True"> 
        <ScrollViewer x:Name="DG_ScrollViewer" Focusable="false"> 
         <ScrollViewer.Template> 
          <ControlTemplate TargetType="{x:Type ScrollViewer}"> 
           <Grid> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto" /> 
             <ColumnDefinition Width="*" /> 
             <ColumnDefinition Width="Auto" /> 
            </Grid.ColumnDefinitions> 
            <Grid.RowDefinitions> 
             <RowDefinition Height="Auto" /> 
             <RowDefinition Height="*" /> 
             <RowDefinition Height="Auto" /> 
            </Grid.RowDefinitions> 
            <Button Command="{x:Static DataGrid.SelectAllCommand}" 
              Focusable="false" 
              Style="{DynamicResource {ComponentResourceKey ResourceId=DataGridSelectAllButtonStyle, TypeInTargetAssembly={x:Type DataGrid}}}" 
              Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.All}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" 
              Width="{Binding CellsPanelHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
            <DataGridColumnHeadersPresenter Grid.Column="1" 
                    x:Name="PART_ColumnHeadersPresenter" 
                    Visibility="{Binding HeadersVisibility, ConverterParameter={x:Static DataGridHeadersVisibility.Column}, Converter={x:Static DataGrid.HeadersVisibilityConverter}, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
            <ScrollContentPresenter x:Name="PART_ScrollContentPresenter" 
                  CanContentScroll="{TemplateBinding CanContentScroll}" 
                  Grid.ColumnSpan="2" 
                  Grid.Row="1" /> 
            <ScrollBar x:Name="PART_VerticalScrollBar" 
               Grid.Column="2" 
               Maximum="{TemplateBinding ScrollableHeight}" 
               Orientation="Vertical" 
               Grid.Row="1" 
               Visibility="{TemplateBinding ComputedVerticalScrollBarVisibility}" 
               Value="{Binding VerticalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
               ViewportSize="{TemplateBinding ViewportHeight}" 
               MinWidth="45" Width="50" /> 
            <Grid Grid.Column="1" 
              Grid.Row="2"> 
             <Grid.ColumnDefinitions> 
              <ColumnDefinition Width="{Binding NonFrozenColumnsViewportHorizontalOffset, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" /> 
              <ColumnDefinition Width="*" /> 
             </Grid.ColumnDefinitions> 
             <ScrollBar x:Name="PART_HorizontalScrollBar" 
                Grid.Column="1" 
                Maximum="{TemplateBinding ScrollableWidth}" 
                Orientation="Horizontal" 
                Visibility="{TemplateBinding ComputedHorizontalScrollBarVisibility}" 
                Value="{Binding HorizontalOffset, Mode=OneWay, RelativeSource={RelativeSource TemplatedParent}}" 
                ViewportSize="{TemplateBinding ViewportWidth}" /> 
            </Grid> 
           </Grid> 
          </ControlTemplate> 
         </ScrollViewer.Template> 
         <ItemsPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" /> 
        </ScrollViewer> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsGrouping" Value="true"> 
      <Setter Property="ScrollViewer.CanContentScroll" Value="false" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

EDIT:

Как expermient, я добавил эту переменную-член в отделенного кода окна с вопросом:

private static Style dataGridRowStyle = null; 

Затем я добавил этот код в конструктор мое окно:

if (dataGridRowStyle == null) { 
    dataGridRowStyle = FindResource(typeof(DataGridRow)) as Style; 
    MyGrid.RowStyle = dataGridRowStyle; 
} 

делая это, я увидел, что каждая строка добавляется в DataGrid га d оригинальный стиль по умолчанию. Это также произошло, когда я переместил вышеуказанный код в обработчик события Loaded.

Затем я удалил код выше и добавил х: Key атрибут в Style определения в файле app.xaml. Затем я добавил этот атрибут для определения контроля DataGrid:

RowStyle={DynamicResource MyDataGridRowStyle} 

Теперь каждая строка имеет свой стиль.Это здорово, но я думал, что объявление моего стиля с помощью атрибута TargetType было достаточно, чтобы заставить его применяться ко всем строкам. Почему не так?

ответ

1

После долгих головных царапин, сердечной боли и поиска в Интернете я, наконец, понял, что происходит в моей программе.

В моей программе используются объединенные словари для реализации дневных и ночных режимов. Оказывается, что объединенные словари стали причиной проблемы, как объяснялось in this tutorial.

Исправление состоит в том, чтобы поместить стиль по умолчанию в корень словаря. На самом деле, мой код имел все шаблоны в словаре ресурсов внутри тега. Я переместил их на уровень, и теперь WPF находит мои шаблоны по умолчанию в первой строке и каждой строке.