gpt4 book ai didi

c# - WPF如何根据窗口大小调整某个控件的大小?

转载 作者:行者123 更新时间:2023-11-30 14:02:37 25 4
gpt4 key购买 nike

我有一个 ListView 控件,我想在其中调整最后一列的大小以与 Window 的大小同步。因此,如果 Window 的宽度增加 100 个单位,我希望列的宽度也增加 100。

我是否应该在 Window 上使用 Resize 事件并使用魔数(Magic Number)手动调整列标题的大小,有点像?:

columnHeader.Width = windowSize.X - 400;

最佳答案

这是一个使用数据绑定(bind)和一些转换器魔术来完成工作的解决方案。

首先,让我们描述一个包含一些数据和 3 列的简单 ListView。

<ListView>
<ListView.View>
<GridView>
<GridViewColumn Width="140" Header="Date" />
<GridViewColumn Width="140" Header="Day"
DisplayMemberBinding="{Binding DayOfWeek}" />
<GridViewColumn Width="140" Header="Year"
DisplayMemberBinding="{Binding Year}"/>
</GridView>
</ListView.View>

<sys:DateTime>1/2/3</sys:DateTime>
<sys:DateTime>4/5/6</sys:DateTime>
<sys:DateTime>7/8/9</sys:DateTime>
</ListView>

这将使我们到达您所在的位置。现在,为了让最后一列根据父级宽度增长和收缩,我们需要构建一个转换器并将其连接起来。首先,让我们调整 GridView 的最后一列,使宽度动态变化。

<GridViewColumn Header="Year" DisplayMemberBinding="{Binding Year}">
<GridViewColumn.Width>
<MultiBinding Converter="{StaticResource lastColumnMaximizerConverter}">
<Binding Path="ActualWidth"
RelativeSource="{RelativeSource AncestorType=ListView}"/>
<Binding Path="View.Columns"
RelativeSource="{RelativeSource AncestorType=ListView}"/>
</MultiBinding>
</GridViewColumn.Width>
</GridViewColumn>

我们在这里所做的是创建了一个 MultiBinding 对象,连接了一个 IMultiValueConverter,并描述了我们要发送到 IMultiValueConverter 实现中的几个参数。第一个参数是父 ListView 的 ActualWidth。第二个参数是父 ListView 上的 View.Columns 集合。我们现在拥有计算 View 中最后一列的最终宽度所需的一切。

现在我们需要创建一个 IMultiValueConverter 实现。我这里正好有一个。

public class WidthCalculationMultiConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType,
object parameter, CultureInfo culture)
{
// do some sort of calculation
double totalWindowWidth;
double otherColumnsTotalWidth = 0;
double.TryParse(values[0].ToString(), out totalWindowWidth);
var arrayOfColumns = values[1] as IList<GridViewColumn>;

for (int i = 0; i < arrayOfColumns.Count - 1; i++)
{
otherColumnsTotalWidth += arrayOfColumns[i].Width;
}

return (totalWindowWidth - otherColumnsTotalWidth) < 0 ?
0 : (totalWindowWidth - otherColumnsTotalWidth);
}

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

Psst.. 顺便说一句,这不是最安全的代码。你会想要美化它!这只是一个演示,你知道演示代码是怎样的! :)

最后,我们需要在 XAML 中实例化 Converter 实例。

<Grid.Resources>
<Converters:WidthCalculationMultiConverter
x:Key="lastColumnMaximizerConverter"/>
</Grid.Resources>

所以现在我们有一个转换器,它会根据 ListView 中列(不包括最后一列)的宽度计算出我们想要制作最后一列的宽度,以及一个将使用该转换器并发送的绑定(bind)输入所需的参数并得到“正确答案”并将其应用于最后一列的宽度。

如果你把它们正确地组合在一起,你现在应该有一个 ListView,其中最后一列将始终拉伸(stretch)到父 ListView 的最大宽度。

我希望这能让您继续前进,但也能帮助您了解我们如何在不编写一些代码隐藏和使用 WPF 提供的更多工具的情况下做到这一点。

关于c# - WPF如何根据窗口大小调整某个控件的大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573152/

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