2015-07-10 8 views
9

Mam ItemsControl zawierający numer dynamicznie changable z datagrids:Stosowanie tej samej wysokości dla wszystkich DataGridColumns gdy maxwidth z nagłówka jest ustawiona

<ItemsControl ItemsSource="{Binding Table.Columns}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch"/> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplateSelector> 
     <local:ColumnTemplateSelector InputParameterColumnTemplate="{StaticResource InputParamterColumn}" 
            SingleParameterColumnTemplate="{StaticResource SingleParameterColumn}"/> 
    </ItemsControl.ItemTemplateSelector> 
</ItemsControl> 

Szablon dla „SingleParameterColumn” jest zdefiniowane tak:

<DataTemplate x:Key="SingleParameterColumn">  
     <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Cells}"  
            RowHeight="25" RowHeaderWidth="0" > 
      <DataGrid.Columns> 
       <DataGridTemplateColumn> 
        <DataGridTemplateColumn.HeaderTemplate> 
         <DataTemplate> 
          <StackPanel Orientation="Horizontal"> 
           <TextBlock Text="{Binding Name}" 
              TextWrapping="Wrap" 
              TextAlignment="Center" 
              MaxWidth="60"> 
           </TextBlock> 
           <Button> 
            <Image ... /> 
           </Button> 
          </StackPanel> 
         </DataTemplate> 
        </DataGridTemplateColumn.HeaderTemplate> 
        <DataGridTemplateColumn.CellTemplateSelector>.... 
        </DataGridTemplateColumn.CellTemplateSelector> 
       </DataGridTemplateColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </DataTemplate> 

Zawsze jest jeden InputParameterColumn i co najmniej jeden SingleParameterColumn. Nazwa InputParameterColumn ma stałą nazwę nagłówka, natomiast nagłówek SingleParameterColumn może być dowolnie długi.

Ponieważ nie chcę mieć bardzo szerokich kolumn, zdefiniowałem MaxWidth z TextBlock w szablonie nagłówka na 60, co powoduje, że nagłówek jest wyższy, jeśli nazwa kolumny jest bardzo długa.

Powoduje to, że kolumny mają różne wysokości w zależności od długości nazwy nagłówka. Here is the issue:

Czy jest jakiś sposób, aby dowiedzieć się, jak wysoki jest najwyższy nagłówek w mojej ItemsControl, a następnie ustawić taką samą wysokość dla wszystkich innych nagłówków, aby moje kolumny miały ten sam rozmiar?

+0

można pokazać zrzut ekranu, co jest doświadczony? – OmegaMan

+0

Oto zrzut ekranu: http://s14.postimg.org/kxhfvh9gh/Capture.png Chciałbym mieć wszystkie nagłówki na tej samej wysokości, aby wiersze mogły być wyrównane. – mobearette

+0

To dziwne, właśnie wypróbowałem twój kod, a moje komórki nagłówkowe miały taki sam rozmiar automatycznie ... Czy edytowałeś szablon DataGrid? Czy jest coś na HeaderTemplate, że nas nie pokazujesz? – almulo

Odpowiedz

9

mogłem wreszcie odtworzyć cię r problem i udało się go rozwiązać z tymi zmianami:

  1. Ustaw Grid.IsSharedSizeScope="True" na StackPanel, który służy jako ItemsPanel dla ItemsControl
  2. On was ItemTemplate, zmień StackPanels rodzaje HeaderTemplates do siatek
  3. Na każdy Siatka określenie jednego wiersza z tym samym identyfikatorem SharedSizeGroup

ItemsControl:

<ItemsControl ItemsSource="{Binding Table.Columns}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
     <StackPanel Orientation="Horizontal" VerticalAlignment="Stretch" 
        Grid.IsSharedSizeScope="True" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 

    <ItemsControl.ItemTemplateSelector> 
     <local:ColumnTemplateSelector InputParameterColumnTemplate="{StaticResource InputParamterColumn}" 
            SingleParameterColumnTemplate="{StaticResource SingleParameterColumn}"/> 
    </ItemsControl.ItemTemplateSelector> 
</ItemsControl> 

ItemTemplate:

<DataTemplate x:Key="SingleParameterColumn">  
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Cells}"  
       RowHeight="25" RowHeaderWidth="0"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.HeaderTemplate> 
        <DataTemplate> 
         <Grid> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="*" /> 
           <ColumnDefinition Width="Auto" /> 
          </Grid.ColumnDefinitions> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="*" 
               SharedSizeGroup="DataGridHeaderRow" /> 
          </Grid.RowDefinitions> 
          <TextBlock Text="{Binding Name}" 
             TextWrapping="Wrap" 
             TextAlignment="Center" 
             MaxWidth="60"> 
          </TextBlock> 
          <Button Grid.Column="1"> 
           <Image ... /> 
          </Button> 
         </Grid> 
        </DataTemplate> 
       </DataGridTemplateColumn.HeaderTemplate> 
       <DataGridTemplateColumn.CellTemplateSelector>.... 
       </DataGridTemplateColumn.CellTemplateSelector> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</DataTemplate> 
+0

Nie, to nie działa, ponieważ moje kolumny nie są powiązane w obrębie jednej siatki danych, ale każda kolumna jest datagridem, zawierającym jedną kolumnę szablonu. – mobearette

+0

Ok, rozumiem, dlatego nie mogłem odtworzyć problemu. Pozwól mi spróbować jeszcze raz, a skontaktuję się z tobą. – almulo

+0

Gotowe. Udaje się go odtworzyć i rozwiązać za pomocą powyższego kodu ... Zamiast ustawiać 'IsSharedSizeScope' na DataGrid, musisz ustawić go na StackPanelu wewnątrz ItemsPanel ItemsControl. – almulo

0

można napisać zachowanie, które przywiązuje do nagłówka TextBlock i wykonuje następujące operacje:

  • subskrybować zdarzenie SizeChanged
  • sklepu gdzieś (prop statycznym lub pomocnika klasy ...) największym rozmiarze
  • jeśli to największe zmiany rozmiaru, wystarczy zmienić wysokość wszystkich elementów zachowanie jest przyłączony do
Powiązane problemy