2016-06-16 3 views
1

У меня есть сетка wpf с двумя столбцами, которые должны быть равномерно распределены. Я знаю о размере звезды (*), но когда я устанавливаю ширину столбца равным образом, фактический столбец изменяется во время выполнения. Общая ширина сетки будет меняться в зависимости от размера окна, но я хочу, чтобы два столбца всегда были одинаковой ширины внутри этой сетки.Фиксированный пропорциональный размер в WPF

В настоящее время у меня есть много вложенных элементов, назначенных для первого столбца, а во втором столбце есть панель ItemsControl, которая отображает только элементы, когда принимается действие события кнопки ... так что бывают случаи, когда она пуста , Мое предположение состоит в том, что, поскольку второй столбец пуст, первый столбец автоматически занимает столько места, сколько может. Есть ли способ заставить столбцы оставаться пропорционально фиксированными? Вот моя основная установка:

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="1*"></ColumnDefinition> 
     <ColumnDefinition Width="1*" ></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <StackPanel Grid.Column="0"> 
     <!-- Lots of nested WPF elements inside this stack panel --> 
    </StackPanel> 
    <ItemsControl Grid.Column="1" ItemsSource="{Binding Tasks}"> 
     <ItemsControl.Template> 
      <ControlTemplate TargetType="{x:Type ItemsControl}" > 
       <ItemsPresenter/> 
      </ControlTemplate> 
     </ItemsControl.Template> 

     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel/> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate DataType="cc:Tasks"> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Text="{Binding Title}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

Я прочитал this thread, но я не совсем уверен, если этот ответ подходит эту проблему.

+1

Будет ли «UniformGrid» работать лучше для вас, чем обычная сетка для того, что вы хотите сделать? –

+0

Вы говорите, что когда Tasks является нулевым или пустым, второй столбец меняет ширину? Сколько места занимает первый столбец, когда он «занимает столько места, сколько может»? Все окно? +1 на 'UniformGrid'. Настройте строки = «1» и «Столбцы =« 2 ». –

+0

Первый столбец занимает столько места, сколько необходимо. У меня есть текстовое поле, которое отображает путь к файлу. Таким образом, когда пользователь изменяет путь к файлу, ширина этого столбца изменяется для настройки. Я предпочел бы, чтобы ширина текстового поля была привязана к первой ширине столбца, которая затем должна составлять ровно 50% от общей ширины сетки. Спасибо за предложение по UniformGrid. Я посмотрю. – andyopayne

ответ

0

Следуя совету @Paparazzi, я создал конвертер для привязки ширины scrollviewer. Вот как я это сделал:

В C# код позади, я создаю конвертер:

public class PercentageConverter : MarkupExtension, IValueConverter 
{ 
    private static PercentageConverter _instance; 

    #region IValueConverter Members 

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return System.Convert.ToDouble(value) * System.Convert.ToDouble(parameter); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 

    #endregion 

    public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     return _instance ?? (_instance = new PercentageConverter()); 
    } 
} 

Тогда в моем .xaml коде, я использую его так:

<UserControl.Resources> 
    <ResourceDictionary> 
     <local:PercentageConverter x:Key="PercentageConverter"></local:PercentageConverter> 
    </ResourceDictionary> 
</UserControl.Resources> 

<Grid Name="ParentGrid"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"></ColumnDefinition> 
     <ColumnDefinition Width="Auto" ></ColumnDefinition> 
    </Grid.ColumnDefinitions> 
    <ScrollViewer Grid.Column="0" 
      HorizontalScrollBarVisibility="Auto" 
      MinWidth="200" 
      Width="{Binding Path=ActualWidth, ElementName=ParentGrid, Converter={StaticResource PercentageConverter}, ConverterParameter='0.6'}"> 
     <StackPanel Orientation="Vertical" ScrollViewer.CanContentScroll="True"> 
      <!-- Lots of other WPF Framework elements --> 
     </StackPanel> 
    </ScrollViewer> 
    <ItemsControl Grid.Column="1" ItemsSource="{Binding Tasks}"> 
     <ItemsControl.Template> 
      <ControlTemplate TargetType="{x:Type ItemsControl}" > 
       <ItemsPresenter/> 
      </ControlTemplate> 
     </ItemsControl.Template> 

     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <StackPanel></StackPanel> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate DataType="cc:Tasks"> 
       <StackPanel Orientation="Vertical"> 
        <TextBlock Text="{Binding Title}"></TextBlock> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

В ключ должен определить преобразователь в ResourceDictionary. Затем я установил свойство width элемента ScrollViewer для привязки к фактической ширине родительской сетки, используя конвертер, чтобы установить его на определенный процент (в этом случае 0,6 является параметром или 60% общей ширины родительского элемента сетка). Надеюсь, это поможет кому-то в будущем.

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