2013-11-23 2 views
0

То, что я хочу иметь:C# WPF Сетка/GridSplitter

  • GridSplitter 3 Колонны
  • в MinWidth для всех 3-х столбцов должны работать
  • слева и правый столбец должен иметь «defaultSize», как 100 и 200
  • , когда я изменяю размер формы, только размер столбца в середине должен изменяться. столбцы слева и справа должны оставаться такой же размер
  • если добавить элементы управления в форме, я хочу, чтобы они изменить их размер в соответствии с разветвителем

Что у меня есть:

  • у меня есть сетка с 3 Столбцы
  • MinWidth для всех 3-х столбцов работает, но только с ColumnWidth = «*»
  • я не знаю, как установить «DefaultSize» для левой и правой колонке, потому что если я изменил ColumnWidth, MinWi DTH не работает больше
  • при изменении размера формы, все 3 колонки изменять их размер, а не только столбец в средней

    <ToolBarTray DockPanel.Dock="Top" IsLocked="True" Background="Pink"> 
        <ToolBar Height="26" Background="Beige"> 
        </ToolBar> 
    </ToolBarTray> 
    
    <StatusBar DockPanel.Dock="Bottom" Height="23" Background="Orange"/> 
    
    <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*" MinWidth="50"/> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width ="*" MinWidth="100"/> 
         <ColumnDefinition Width="Auto"/> 
         <ColumnDefinition Width="*" MinWidth="50"/> 
        </Grid.ColumnDefinitions> 
        <Grid.RowDefinitions> 
         <RowDefinition Height="*"/> 
        </Grid.RowDefinitions> 
    
        <GridSplitter Grid.Column="1" Width="5" ShowsPreview="True" Background="Red" HorizontalAlignment="Center" VerticalAlignment="Stretch"/> 
    
    
        <GridSplitter Grid.Column="3" Width="5" ShowsPreview="True" Background="Red" HorizontalAlignment="Center" VerticalAlignment="Stretch"/> 
    
    </Grid> 
    

Спасибо до сих пор :)

+0

Как насчет установки ширины в "Auto" для других столбцов, а? Таким образом, ваши столбцы будут иметь ширину по умолчанию MinWidth. Если вы хотите сделать больше логики вокруг ваших вложений, вам нужно сделать это в коде или привязать к ширине другого элемента. –

+0

Итак, с помощью Width = Auto для левого и правого столбцов MinWidth столбца в середине больше не работает - так вы думаете, что я должен решить это в коде? ..... Я также не знаю, как установить размер «По умолчанию» для левого и правого столбцов, так как это «Авто» – Felix

ответ

1

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

<Grid> 
    <StatusBar Height="23" Background="Orange" DockPanel.Dock="Bottom"/> 
    <Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition MinWidth="50" Width="200"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition MinWidth="100" Width="*"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition MinWidth="50" Width="200"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="*"/> 
    </Grid.RowDefinitions> 
    <GridSplitter 
     Width="5" 
     Grid.Column="1" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Stretch" 
     Background="Red" 
     ShowsPreview="True"/> 
    <GridSplitter 
     Width="5" 
     Grid.Column="3" 
     HorizontalAlignment="Center" 
     VerticalAlignment="Stretch" 
     Background="Red" 
     ShowsPreview="True"/> 
    </Grid> 
</Grid> 

EDIT

здесь является исправлением для первой сетки MaxWidth проблему

<Grid x:Name="Root"> 
     <Grid.Resources> 
     <local:MaxWidthConverter x:Key="MaxWidthConverter" /> 
     </Grid.Resources> 

     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition MinWidth="50" 
          Width="200" 
          MaxWidth="{Binding ElementName=Root, Path=ActualWidth, Mode=OneWay, Converter={StaticResource MaxWidthConverter}, ConverterParameter=260}" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition MinWidth="200" 
          Width="*" /> 
      <ColumnDefinition Width="Auto" /> 
      <ColumnDefinition MinWidth="50" 
          Width="200" /> 
     </Grid.ColumnDefinitions> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*" /> 
     </Grid.RowDefinitions> 
     <GridSplitter Width="5" 
         Grid.Column="1" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Stretch" 
         Background="Red" 
         ShowsPreview="True" /> 
     <GridSplitter Width="5" 
         Grid.Column="3" 
         HorizontalAlignment="Center" 
         VerticalAlignment="Stretch" 
         Background="Red" 
         ShowsPreview="True" /> 
     </Grid> 
    </Grid> 

простой преобразователь для расчета максимальной ширины для первого столбца (260 = 200 мин. Ширина + 50 минут + ширина сплиттера + 5 ширина разделителя

public class MaxWidthConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    double minWidth; 
    if (value is double && parameter is string && double.TryParse((string)parameter, NumberStyles.Any, CultureInfo.InvariantCulture, out minWidth)) { 
     var maxWidth = (double)value - minWidth; 
     return maxWidth < 0 ? 0 : maxWidth; 
    } 
    return 0; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    return DependencyProperty.UnsetValue; 
    } 
} 

enter image description here

enter image description here

+0

Спасибо! но можете ли вы объяснить мне, как исправить minWidth для столбца посередине? – Felix

+0

MinWidth в середине работает для меня – punker76

+0

Спасибо вам большое! Но это странно. Для левого и правого столбцов MinWidth и MaxWidth работают правильно (также без вашего конвертера). Но для столбца посередине ни MinWidth, ни MaxWidth не работают .... – Felix