Изменение размера WPF, * против Авто - PullRequest
1 голос
/ 27 сентября 2011

У меня есть XAML с 2 столбцами в сетке, и у меня есть кнопка, которая, когда я нажимаю на нее, в коде позади, я устанавливаю видимость, чтобы свернуть, и хочу изменить размер другой половины экрана, чтобы попытаться взять на весь экран. Свертывающая часть работает, и тогда RHS переходит к LHS, но он не занимает весь экран. Я пытался использовать Auto и Star для изменения размера в HidePlots, но он никогда не занимал весь экран. Я подумал, что если я сверну LHS и установлю столбец * для RHS, он займет весь экран. Какие-нибудь мысли? Спасибо.

Вот некоторый код, чтобы сделать его более понятным:

<Grid Grid.Row="1" x:Name="ExpandableGrid">            
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="1.5*"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Grid Grid.Column="0" x:Name="TableGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>               

        <GroupBox Grid.Row="0" Grid.Column="0" x:Name="SampleViewGroupBox" Header="SampleView" HorizontalAlignment="Stretch" FontFamily="Arial" FontSize="12"  Margin="5,0,5,0" >
            <ContentControl Content="{Binding LayoutManager.SampleView}" Height="Auto" Width="Auto"/>
        </GroupBox>

        <Button x:Name="TableButton" HorizontalAlignment="Right" Content="Button" Width="15" Height="15" VerticalAlignment="Top" Margin="0,0,-2,0" Click="MaxButton_Click"  Grid.Column="0" Grid.Row="0"/>
    </Grid>

    <Grid Grid.Column="1" x:Name="BaseViewGrid">
        <Grid.RowDefinitions>
            <RowDefinition Height="*"></RowDefinition>
        </Grid.RowDefinitions>
        <GroupBox Grid.RowSpan="2" Grid.Column="1" Name="BaseViewGroupBox" Header="PLOTS" Margin="5,0,5,0" >
            <ContentControl Content="{Binding LayoutManager.ConsensusView}" Height="Auto" Width="Auto" />
        </GroupBox>
    </Grid>
</Grid>



private void MaxButton_Click(object sender, RoutedEventArgs e)
{
    UIElement senderElement = (UIElement)sender;

    if (_tableMinimized)
    {
        HideTables(false);
        _tableMinimized = false;
        ((Button)senderElement).Style = (Style)FindResource("DashboardDetailsButton");
    }
    else
    {
        HideTables(true);
        _tableMinimized = true;
        ((Button)senderElement).Style = (Style)FindResource("DashboardDetailsButtonReverse");               
    }
}

private void HideTables(bool hide)
{
    if (hide)
    {
        foreach (UIElement child in TableGrid.Children)
            child.Visibility = Visibility.Collapsed;

        for (int i = 0; i < ExpandableGrid.ColumnDefinitions.Count; i++)
            ExpandableGrid.ColumnDefinitions[i].Width = GridLength.Auto;

        ExpandableGrid.ColumnDefinitions[1].MinWidth = 500;

        for (int i = 0; i < ExpandableGrid.RowDefinitions.Count; i++)
            ExpandableGrid.RowDefinitions[i].Height = GridLength.Auto;

        TableButton.Visibility = Visibility.Visible;
    }
    else
    {
        foreach (UIElement child in TableGrid.Children)
            child.Visibility = Visibility.Visible;

        for (int i = 0; i < ExpandableGrid.ColumnDefinitions.Count; i++)
            ExpandableGrid.ColumnDefinitions[i].Width = new GridLength(1, GridUnitType.Star);

        for (int i = 0; i < ExpandableGrid.RowDefinitions.Count; i++)
            ExpandableGrid.RowDefinitions[i].Height = new GridLength(1, GridUnitType.Star);
    }
}

Редактировать: Я также пытался изменить одну строку на:

ExpandableGrid.ColumnDefinitions[1].MinWidth = System.Windows.SystemParameters.PrimaryScreenWidth-20;

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

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

В вашем текущем определении столбца указано, чтобы столбец B был равен 1.5 размеру столбца A, поэтому даже если содержимое ColumnB скрыто, столбец все равно будет занимать 3/5 экрана.

Измените его так, чтобы столбец, который свертывался, имел Width="Auto", и установите для его содержимого значение Width равным размеру, который должен быть при развертывании.Если вы хотите сохранить ширину по умолчанию 1.5*, я бы рекомендовал использовать что-то вроде MathConverter, чтобы выяснить, какой размер должен быть основан на ширине родительской сетки.У меня есть код для одного отправленного здесь

<Grid x:Name="ParentGrid">   
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"></ColumnDefinition>
        <ColumnDefinition Width="Auto"></ColumnDefinition>
    </Grid.ColumnDefinitions>

    <Grid x:Name="RHS" Grid.Column="0" />

    <!-- Collapse this Grid -->
    <Grid x:Name="LHS" Grid.Column="1" 
          Width="{Binding ElementName=ParentGrid, Path=ActualWidth,
          Converter={StaticResource MathConverter},
          ConverterParameter=((@VALUE/5)*3)}" /> 
</Grid>
1 голос
/ 27 сентября 2011

Вам нужно установить для столбца 0 желаемое значение (Авто, 150 и т. Д.) И установить для столбца 1 значение *.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...