2014-04-24 4 views
0

Я пытаюсь отобразить Сетка с чередующимся цветом друг друга. Лучше всего будет чередовать шаблон вместе, чтобы иметь возможность изменять всю строку.Сетка альтернативного цвета

Для того, чтобы убедиться, что нет никаких недоразумений, когда я имею в виду сетки я имею в виду сетки, не DataGrid, не GridView, сетка, как в <Grid></Grid>

Сейчас единственное жизнеспособное решение я нашел в том, чтобы сделать сетку с соответствующей количество строк, которые я хочу, и в каждой строке я помещаю еще одну сетку с 1 строкой и 3 столбцами, которые мне нужны, и скопируйте их для каждой строки, изменив задний цвет. Как вы можете видеть, это не очень чистое решение.

Итак, я осмотрел и обнаружил, что список может иметь альтернативный счет, а на простом триггере он может изменить все, и это было идеально, пока я не заметил, что подсветка НЕ ​​МОЖЕТ быть отключена. Вы можете изменить выделенную кисть, но она переопределяет альтернативный цвет, поэтому оба они не могут использоваться одновременно. Прежде чем вы спросите «да», я использовал прозрачный куст, а прозрачность НЕ действительно прозрачна. Все, что он делает, это то, что он отображает цвет под элементом управления ListBox, который был бежевым цветом холста под ним, и сам элемент исчезает.

Кто-нибудь знает способ применения шаблона чередующейся строки на сетке. Положить простой стиль на RowDefinition было бы легко, но поскольку вы не можете сказать тип элемента, который вы помещаете в сетку, я сомневаюсь, что есть что-то, что можно сделать так просто.

EDIT: здесь мое последнее изменение. немного «чище» я создал 2 стиль для контроля элемента для каждого цвета темы как

<Style x:Key="PropertyGrid" TargetType="ItemsControl"> 
     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <Grid Background="White">       
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="300"/> 
          <ColumnDefinition Width="2"/> 
          <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="40"/> 
         </Grid.RowDefinitions> 
        </Grid> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style x:Key="AlternatePropertyGrid" TargetType="ItemsControl"> 
     <Setter Property="ItemsPanel"> 
      <Setter.Value> 
       <ItemsPanelTemplate> 
        <Grid Background="#FFEBEBEB"> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="300"/> 
          <ColumnDefinition Width="2"/> 
          <ColumnDefinition Width="*" /> 
         </Grid.ColumnDefinitions> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="40"/> 
         </Grid.RowDefinitions> 
        </Grid> 
       </ItemsPanelTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Затем я использовал панель стека и перечислены каждую строку

<StackPanel> 
    <ItemsControl Style="{StaticResource PropertyGrid}"> 
     <Label Content="Identifier" Style="{StaticResource PropertyNameLabel}"/> 
     <Label Content="{Binding ElementName=cboActions, Path=SelectedItem.UniqueIdentifier}" Style="{StaticResource PropertyValueLabel}"/> 
     <Rectangle Style="{StaticResource PropertyGridSplitter}"/> 
    </ItemsControl> 
    <ItemsControl Style="{StaticResource AlternatePropertyGrid}"> 
     <Label Content="Source" Style="{StaticResource AlternatePropertyNameLabel}"/> 
     <Label Name="lblSource" Style="{StaticResource AlternatePropertyValueLabel}"/> 
     <Rectangle Style="{StaticResource AlternatePropertyGridSplitter}"/> 
    </ItemsControl> 
    <ItemsControl Style="{StaticResource PropertyGrid}"> 
     <Label Content="Description" Style="{StaticResource PropertyNameLabel}"/> 
     <Label Name="lblActionDescription" Style="{StaticResource PropertyValueLabel}"/> 
     <Rectangle Style="{StaticResource PropertyGridSplitter}"/> 
    </ItemsControl> 
</StackPanel> 

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

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

enter image description here

+0

Почему бы не расширить элемент управления и добавить DependencyProperties, который сделает это за вас? – Kcvin

+0

Возможно, но мне все равно придется создавать расширенный элемент управления для каждого стиля, который я планирую использовать. Но на самом деле это сделает очиститель XAML. – Franck

ответ

-1

Повторяя код был самым быстрым решением.

0

С Datagrid, вы можете легко сделать:

<DataGrid AlternatingRowBackground="Blue"/> 

С решеткой, нет идеи: р

0

За ListBox внутри сетки, мы устанавливаем альтернативные цвета с несколько строк кода (код-сзади).

private void SetAlternateColor() 
    { 
     var blueBrush = new SolidColorBrush(Colors.Blue); 
     var redBrush = new SolidColorBrush(Colors.Red); 

     for (int i = 0; i < Items.Count; i++) 
     { 
      ListBoxItem item = TestListBox.ItemContainerGenerator.ContainerFromIndex(i) as ListBoxItem; 
      item.Background = i % 2 == 0 ? blueBrush : redBrush; 
     } 
    } 

    private void TestGrid_Loaded(object sender, RoutedEventArgs e) 
    { 
     SetAlternateColor(); 
    } 

Не знаю, является ли это то, что вы ищете.

Смежные вопросы