在WPF中为Grid列宽创建复杂计算

时间:2011-02-01 03:03:05

标签: wpf layout

是否可以创建复杂的计算来确定WPF中列(或任何控件)的宽度?因此,例如,我希望Grid.Column3.Width等于Grid.Width - Grid.Column2.Width - 100。

具体来说,这就是我正在做的事情:

我有一个有三列的网格。第一列有一个可能已折叠的取消按钮。第二个有一个文本框。第三个进度条(可能会崩溃)。

我希望按钮始终具有所需的所有宽度(如果可见)。我想尝试显示所有文本框。并将所有其余宽度提供给进度条(如果可见)。但我不希望进度条小于200.如果需要,文本框应该被截断,以使进度条至少为200.

所以,我想要这样的事情:

 <Grid.ColumnDefinitions>
  <ColumnDefinition Width="Auto"/>
  <ColumnDefinition Width="Auto"/>
  <ColumnDefinition Width="*" MinWidth="200"/>   
 </Grid.ColumnDefinitions>

但是这不起作用(如果没有足够的空间,进度条将被推离网格的一侧)。

表示此问题的最佳方式是什么?我可以完全在XAML中完成,还是需要使用代码隐藏?

1 个答案:

答案 0 :(得分:3)

我无法想方设法在Xaml中严格执行此操作。
你可以使用MultiBinding作为TextBox的MaxWidth,你可以使用以下作为Bindings

  • Grid
  • 的ActualWidth
  • Button
  • 的ActualWidth
  • ProgressBar的最小宽度

Xaml

<Grid Name="grid">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Button Name="button" Grid.Column="0" Content="Cancel"/>
    <TextBox Grid.Column="1" Text="Some Text">
        <TextBox.MaxWidth>
            <MultiBinding Converter="{StaticResource MaxWidthMultiConverter}">
                <Binding ElementName="grid" Path="ActualWidth"/>
                <Binding ElementName="button" Path="ActualWidth"/>
                <Binding ElementName="progressBar" Path="MinWidth"/>
            </MultiBinding>
        </TextBox.MaxWidth>
    </TextBox>
    <ProgressBar Name="progressBar" Grid.Column="2" Value="50" Maximum="100" MinWidth="200"/>
</Grid>

MaxWidthMultiConverter

public class MaxWidthMultiConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double gridWidth = (double)values[0];
        double buttonWidth = (double)values[1];
        double progressBarMaxWidth = (double)values[2];
        return gridWidth - (buttonWidth + progressBarMaxWidth);
    }
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}