2010-08-02 3 views
0

Упрощенная проблема.Выровнять размеры органов управления

У меня есть два ItemsControl S, расположенных друг под другом и связаны с одной и той же последовательности:

[Control] [Another Control] [More Controls] 
[Other Ctrl] [Super Control] [Control] 

То, что я хотел бы сделать, это выровнять их размеры таковы, что они, как представляется, одна таблица:

[Control ] [Another Control] [More Controls] 
[Other Ctrl] [Super Control ] [Control  ] 

было бы также приемлемо идти «в одну сторону»: сделать нижних элементов такого же размера, как лучших из них, даже если они короче:

[Control] [Another Control] [More Controls] 
[Other C] [Super Control ] [Control  ] 

Несколько соображений:

  1. Да, они имеют быть в отдельных ItemControl с.
  2. Нет, я не могу использовать Grid или DataGrid.
  3. Я полностью владею структурой данных фонов (если это поможет)

Для более полного объяснения, можно обратиться к моим other question.

UPDATE: Почему они должны находиться в разных ItemControls
В общем, что я пытаюсь добиться, чтобы построить таблицу, которая связана с прямоугольной структурой данных. Я не вижу никакого способа сделать это, кроме использования вложенных ItemControl s: один ItemControl для строк, каждый элемент содержит другой ItemControl для ячеек в этой строке. Или наоборот: один для столбцов, каждый элемент содержит ячейки в этой колонке. В любом случае вложенные элементы должны быть выровнены друг с другом.
Я понимаю, что может быть другой способ создать такую ​​таблицу, которую я не вижу. Вот почему я также спросил other question.

Спасибо, о всемогущее сообщество, заранее.

+0

Это поможет, если вы могли бы объяснить * почему * вы не можете использовать Grid. Есть ли другие макеты, которые вы не можете использовать? Почему нет? –

+0

В моем другом вопросе есть более полное и обобщенное объяснение: http://stackoverflow.com/questions/3385344/grid-with-decoupled-scrolling. В частности, Grid нельзя использовать, поскольку он не может автоматически генерировать строки/столбцы из последовательности данных. Я также немного обновил этот вопрос, посмотрим, поможет ли это. –

ответ

0

Попробуйте следующее:

<StackPanel Grid.IsSharedSizeScope="True"> 
    <StackPanel.Resources> 
     <DataTemplate x:Key="SharedSizeTemplate"> 
      <Grid> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" SharedSizeGroup="SharedSize"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock Text="{Binding}"/> 
      </Grid> 
     </DataTemplate> 
    </StackPanel.Resources> 
    <ItemsControl ItemTemplate="{StaticResource SharedSizeTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <System:String>One</System:String> 
     <System:String>Longer</System:String> 
     <System:String>Longest</System:String> 
     <System:String>Very Longest</System:String> 
    </ItemsControl> 
    <ItemsControl ItemTemplate="{StaticResource SharedSizeTemplate}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <VirtualizingStackPanel Orientation="Horizontal"/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 
     <System:String>Short</System:String> 
     <System:String>S</System:String> 
     <System:String>Even longer than above</System:String> 
     <System:String>V</System:String> 
    </ItemsControl> 
</StackPanel> 

EDIT: Существует еще одна проблема, хотя - все столбцы будут иметь размеры в той же оптимальной ширины - не знаю, если вы можете жить с этим?

+0

Ничего себе, спасибо большое! Честно говоря, я уже начал думать, что мне придется создавать/управлять элементами пользовательского интерфейса вручную.И все в порядке, когда все столбцы имеют одинаковую ширину: я могу на самом деле создавать отдельные идентификаторы строк для каждого столбца, помещать их в мою структуру данных и связывать свойства 'SharedSizeGroup' соответствующих столбцов с этим свойством« ColumnID », тем самым делая их разными размер. –

+0

Однако это создает еще одну проблему: как только я поместил свойство 'SharedSizeGroup' в' ColumnDefinition', этот столбец перестает растягиваться, чтобы заполнить доступное пространство. По-моему, мне нужно, чтобы последний столбец растянулся до конца. Любые идеи о том, как это получить? –

+0

Хм ... тогда вам нужно возиться с DataTemplateSelector - на основе позиции элементов в переключателе списка между двумя DataTemplates ... Это может стать беспорядочным ... Или реализовать пользовательскую панель для ItemsPanelTemplate - позвольте мне знайте, что вы предпочитаете, и я обновлю образец. – Goblin

0

Я имел аналогичные проблемы в последнее время, и, наконец, я сделал это с моим простым хаком для DataTemplate с помощью DockPanel так:

<DockPanel VerticalAlignment="Center" HorizontalAlignment="Stretch" LastChildFill="True"> 
    <TextBox DockPanel.Dock="Right" Width="40" Text="{Binding CurrentValue}"></TextBox> 
    <Slider DockPanel.Dock="Right" Width="60" ...></Slider> 
    <TextBlock DockPanel.Dock="Right" Text="{Binding Header}"></TextBlock> 
</DockPanel> 

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

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