2012-06-21 2 views
5

Этот вопрос трудно описать лаконично, так что несите меня.WPF Размер сетки

В настоящее время у меня есть сетка с двумя рядами. Высота первой строки - Auto, а высота второй строки - *, поэтому, когда я изменяю размер окна, второй ряд растет и сжимается в зависимости от окна.

Это основная схема:

<Window> 
    <Grid> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto" /> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <Border> 
      ... 
     </Border> 
     <Border Grid.Row="2"> 
      ... 
     </Border> 
    </Grid> 
</Window> 

Вот бедный эскиз существующего поведения:

____ ____ ____ 
    ->  -> 
____ ____ ____ 
       ____ 
     ____ 
____ 

Я хотел бы добавить что-то вроде «минимальной высоты» на втором ряду , так что, когда я изменяю размер окна достаточно маленьким, вторая строка перестает сокращаться, а первая строка начинает сокращаться.

Желаемая поведение:

____ ____ ____ 
    ->  -> ____ 
____ ____ 
       ____ 
     ____ 
____ 

Есть простой способ, чтобы получить минимальную высоту второго ряда, и заставить первый сжиматься?

Подробнее:

Когда я установил MinHeight на втором ряду, он просто обрезает сетки при изменении размера его ниже этого размера.

Размер элементов управления в первой строке неизвестен во время компиляции, но известен во время выполнения. Если это необходимая часть решения, я могу установить MaxHeight в строке, но сейчас работает Auto height.

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

ответ

7

Размер элементов управления в первой строке неизвестен во время компиляции, но известен во время выполнения. Если это необходимая часть решения, я могу установить MaxHeight в строке, но сейчас работает Auto height.

Я думаю, что это, вероятно, будет самым простым решением. Свяжите MaxHeight к расчетному значению во время выполнения:

<Grid.RowDefinitions> 
    <RowDefinition Height="*" MaxHeight="{Binding MyProperty}"/> 
    <RowDefinition Height="*" MinHeight="100"/> 
</Grid.RowDefinitions> 

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

<Grid ShowGridLines="True" Name="myGrid"> 
    <Grid.Resources> 
     <local:RowHeightConverter x:Key="rowHeightConverter" /> 
    </Grid.Resources> 
    <Grid.RowDefinitions> 
     <RowDefinition Name="row1" MaxHeight="{Binding MyProperty}"> 
      <RowDefinition.Height> 
       <MultiBinding Converter="{StaticResource rowHeightConverter}"> 
        <Binding Path="ActualHeight" ElementName="row2" /> 
        <Binding Path="ActualHeight" ElementName="myGrid" /> 
        <Binding Path="MaxHeight" ElementName="row1" /> 
       </MultiBinding> 
      </RowDefinition.Height> 
     </RowDefinition> 
     <RowDefinition Name="row2" Height="*" MinHeight="300"/> 
    </Grid.RowDefinitions> 
</Grid> 

И ваш конвертер:

public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
{ 
    double row2Height = (double)values[0]; 
    double gridHeight = (double)values[1]; 
    double row1MaxHeight = (double)values[2]; 

    if (gridHeight - row2Height >= row1MaxHeight) 
    { 
     return gridHeight - row2Height; 
    } 

    return row1MaxHeight; 
} 
+0

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

+0

@ KendallFrey Предыдущее решение не работало для всех случаев, поэтому я добавил решение, которое должно отвечать вашим потребностям. –

+0

Спасибо за MultiBinding. Я не знал об этом. Один вопрос: в реальной сетке есть несколько других строк с фиксированным и автоматическим размером, поэтому я предполагаю, что я должен делать «gridHeight - row2height - row3height» и т. Д.? –

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