是否可以创建复杂的计算来确定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中完成,还是需要使用代码隐藏?
答案 0 :(得分:3)
我无法想方设法在Xaml中严格执行此操作。
你可以使用MultiBinding作为TextBox
的MaxWidth,你可以使用以下作为Bindings
Grid
Button
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();
}
}