2011-02-01 83 views
1

是否可以創建複雜的計算來確定WPF中的列(或任何控件)的寬度?所以,舉例來說,我想Grid.Column3.Width等於Grid.Width - Grid.Column2.Width - 100爲WPF中的網格列寬度創建複雜的計算

具體來說,這就是我的工作:

我有三個網格列。第一列有一個可能摺疊的取消按鈕。第二個有一個文本框。第三個有一個進度條(可能會被摺疊)。

我希望按鈕始終具有所需的所有寬度(如果它是可見的)。我想嘗試顯示所有的文本框。並將所有寬度的剩餘部分留給進度條(如果可見)。但是,我不想進度條不到200文本框應在必要時給予進度條最低200

因此被截斷,我想是這樣的:

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

但這不起作用(如果沒有足夠的空間,進度條將從網格側面推開)。

代表此的最佳方式是什麼?我可以在XAML中完全做到嗎,還是我需要使用代碼隱藏?

回答

3

我不能想出一種在Xaml中嚴格執行此操作的方法。
你可以使用一個MultiBinding對於您使用以下爲綁定

  • Grid ActualWidth的
  • Button ActualWidth的
  • ProgressBar
MinWidth

XAML中TextBox的MaxWidth

<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(); 
    } 
}