gpt4 book ai didi

wpf - 更改缩放顺序 WPF

转载 作者:行者123 更新时间:2023-12-03 23:53:07 24 4
gpt4 key购买 nike

我有一个需要响应的 WPF 应用程序。我想要的是DataGrid里面Grid .当窗口缩小时,我想要 Grid先调整大小,然后是 DataGrid .这是我迄今为止取得的成就:

enter image description here

在顶部的 gif 中,您可以看到 Grid首先调整大小,当它达到最小缩放大小时,它会越过底部 DataGrid .不完全是我想要的,因为我想先缩放布局,然后在 DataGrid 中显示滚动条而不是布局只是过去。所以我尝试了以下方法:

enter image description here

在这里你可以看到它显示了我想要的滚动条。唯一的事情是它首先调整 DataGrid 的大小,当它完成调整 DataGrid 的大小时,它开始调整 Grid 的大小。我希望它是相反的,首先调整网格的大小,然后调整 DataGrid 的大小并显示滚动条。所以基本上我正在寻找执行以下操作的解决方案:

  • 缩放缩放网格的窗口。
  • 缩放网格直到它的最小尺寸
  • 当它达到最小尺寸并且仍然越来越小时,在 DataGrid 中显示滚动条。

  • 所以这归结为这个问题的第一个 Gif,然后是 DataGrid 中的滚动条

    有没有办法做到这一点?看起来我很接近,因为它是这两件事的结合,但我不知道如何。这是我的代码:
    <Grid Grid.Row="1" HorizontalAlignment="Right"  Grid.Column="0">
    <Grid ShowGridLines="False">
    <Grid.RowDefinitions>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="20"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Name="DataGridRow" Height="*" MaxHeight="240" />
    </Grid.RowDefinitions>

    <Label Grid.Row="1" FontSize="24">Test</Label>
    <Label Grid.Row="3" Content="Test"/>
    <ComboBox Grid.Row="5" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" />
    <Label Grid.Row="7" Content="Test"/>
    <ComboBox Grid.Row="9" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left"/>
    <Separator Grid.Row="11"/>

    <Label Grid.Row="13" Content="Test" />
    <Grid Grid.Row="15">
    <DataGrid
    RowHeight="40"
    CanUserAddRows="False"
    x:Name="dataGrid"
    AutoGenerateColumns="False"
    CanUserResizeColumns="True"
    HeadersVisibility="None"
    GridLinesVisibility="None"
    ScrollViewer.CanContentScroll="True"
    ScrollViewer.VerticalScrollBarVisibility="Visible"
    ScrollViewer.HorizontalScrollBarVisibility="Auto"
    <DataGrid.Columns>
    <DataGridTextColumn IsReadOnly="True" Width="*" Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
    <Style TargetType="TextBlock">
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="Margin" Value="2,0,0,0"/>
    </Style>
    </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
    </DataGrid.Columns>
    </DataGrid>
    </Grid>
    </Grid>
    </Grid>

    最佳答案

    在无法使用默认构建块求解布局方程的情况下,您可以
    自己做计算。让转换器计算剩余的可用空间。

    剩下的问题是双重的:

  • DataGrid可能只有在星形大小的行有时才会收缩ActualHeight 0.

    解决方案:DataGrid.Style那套dataGrid.MaxHeighttriggerGrid.ActualHeight = 0 ( triggerGrid 占据一颗星大小
    行)。
  • 当我们给出 MinHeightDataGridRow它不会缩小时dataGrid.ActualHeight收缩(它窃取了收缩的高度
    回)。

    解决方案:RowDefinition.Style设置其 MinHeightdataGrid.ActualHeighttriggerGrid.ActualHeight = 0 并且到
    否则为固定值。

  • 我已经设置了控件的 BackGround颜色来说明当星星大小的高度(剩余的空白区域)变为 0 时。
    <Window 

    ...

    Width="200" Height="450">
    <Window.Resources>
    <local:HeightConverter x:Key="HeightConverter" />
    <local:IsEqualToZeroConverter x:Key="IsEqualToZeroConverter" />
    </Window.Resources>
    <!--MainGrid-->
    <Grid x:Name="mainGrid">
    <Grid ShowGridLines="False">
    <Grid.RowDefinitions>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="20"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="50"/>
    <RowDefinition Height="auto"/>
    <RowDefinition MaxHeight="5"/>
    <RowDefinition x:Name="dataGridRow" Height="Auto">
    <RowDefinition.Style>
    <Style TargetType="{x:Type RowDefinition}">
    <Style.Triggers>
    <DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid, Converter={StaticResource IsEqualToZeroConverter}}" Value="True">
    <Setter Property="MinHeight" Value="{Binding ActualHeight, ElementName=dataGrid}"/>
    </DataTrigger>
    <DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid, Converter={StaticResource IsEqualToZeroConverter}}" Value="False">
    <Setter Property="MinHeight" Value="80.0"/>
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </RowDefinition.Style>
    </RowDefinition>
    </Grid.RowDefinitions>
    <Label x:Name="bigLabel" Grid.Row="1" FontSize="24" Background="LightGray">Test</Label>
    <Label x:Name="regularLabel" Grid.Row="3" Content="Test" Background="LightGray"/>
    <ComboBox x:Name="comboBox" Grid.Row="5" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" Background="LightGray" />
    <Label Grid.Row="7" Content="Test" Background="LightGray"/>
    <ComboBox Grid.Row="9" MaxWidth="500" MinWidth="300" HorizontalAlignment="Left" Background="LightGray"/>
    <Separator x:Name="separator" Grid.Row="11"/>
    <Label Grid.Row="13" Content="Test" Background="LightGray"/>
    <!--TriggerGrid-->
    <Grid Grid.Row="14" x:Name="triggerGrid"/>
    <Grid Grid.Row="15">
    <DataGrid
    x:Name="dataGrid"
    RowHeight="40"
    CanUserAddRows="False"
    AutoGenerateColumns="False"
    CanUserResizeColumns="True"
    HeadersVisibility="None"
    GridLinesVisibility="None"
    ScrollViewer.CanContentScroll="True"
    ScrollViewer.VerticalScrollBarVisibility="Visible"
    ScrollViewer.HorizontalScrollBarVisibility="Auto">
    <DataGrid.Style>
    <Style TargetType="{x:Type DataGrid}">
    <Style.Triggers>
    <DataTrigger Binding="{Binding ActualHeight, ElementName=triggerGrid}" Value="0">
    <Setter Property="MaxHeight">
    <Setter.Value>
    <MultiBinding Converter="{StaticResource HeightConverter}">
    <Binding ElementName="mainGrid" Path="ActualHeight"/>
    <Binding ElementName="bigLabel" Path="ActualHeight"/>
    <Binding ElementName="regularLabel" Path="ActualHeight"/>
    <Binding ElementName="comboBox" Path="ActualHeight"/>
    <Binding ElementName="separator" Path="ActualHeight"/>
    </MultiBinding>
    </Setter.Value>
    </Setter>
    </DataTrigger>
    </Style.Triggers>
    </Style>
    </DataGrid.Style>
    <DataGrid.Columns>
    <DataGridTextColumn IsReadOnly="True" Width="*" Binding="{Binding Name}">
    <DataGridTextColumn.ElementStyle>
    <Style TargetType="TextBlock">
    <Setter Property="VerticalAlignment" Value="Center" />
    <Setter Property="Margin" Value="2,0,0,0"/>
    </Style>
    </DataGridTextColumn.ElementStyle>
    </DataGridTextColumn>
    </DataGrid.Columns>
    </DataGrid>
    </Grid>
    </Grid>
    </Grid>
    </Window>

    转换器
    public class HeightConverter : IMultiValueConverter
    {
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
    // only 1 check at startup (Debugging)
    if ((double)values[1] == 0.0) return 0.0;

    double mainGridHeight = (double)values[0];
    double bigLabelHeight = (double)values[1];
    double regularLabelHeight = (double)values[2];
    double comboBoxHeight = (double)values[3];
    double separatorHeight = (double)values[4];

    double dataGridHeight = mainGridHeight - bigLabelHeight - 2 * (regularLabelHeight + comboBoxHeight) - regularLabelHeight - separatorHeight;

    if (dataGridHeight > 0.0) return dataGridHeight; else return 0.0;
    }

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

    public class IsEqualToZeroConverter : IValueConverter
    {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
    return ((double)value == 0.0);
    }

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

    关于wpf - 更改缩放顺序 WPF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40548505/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com