2011-02-01 8 views
1

WPFの列(または任意のコントロール)の幅を決定する複雑な計算を作成できますか?ですから、例えば、私はGrid.Column3.WidthがGrid.Widthに等しくなるようにしたい - Grid.Column2.Width - 100WPFのグリッド列幅の複雑な計算を作成

具体的には、これは私が働いているものです:

私は3でグリッドを持っています列。最初の列にはキャンセルボタンがあり、折りたたむことができます。 2番目にはテキストボックスがあります。そして3番目に進捗バーがあります(これは崩壊する可能性があります)。

ボタンには常に必要な幅(表示されている場合)が必要です。私はすべてのテキストボックスを表示しようとしたいです。残りの幅はすべてプログレスバーに表示します(表示されている場合)。

<Grid.ColumnDefinitions> 
    <ColumnDefinition Width="Auto"/> 
    <ColumnDefinition Width="Auto"/> 
    <ColumnDefinition Width="*" MinWidth="200"/> 
</Grid.ColumnDefinitions> 
:しかし、私はプログレスバーが必要な場合は、テキストボックスだから200

の最小値をバーの進捗状況を与えるために切り捨てられるべきで200未満にしたくない、私はこのような何かをしたいです

しかし、これはうまくいきません(十分な空きがない場合、プログレスバーはグリッドの側面から押し出されます)。

これを表す最も良い方法は何ですか?完全にXAMLでやってもいいですか、コードビハインドを使う必要がありますか?

答えて

3

これをXamlで厳密に行う方法を考え出すことはできません。
あなたはバインディング

  • ProgressBar

XAMLButton

  • のminWidthのGrid
  • ActualWidthのActualWidthとして以下を使用TextBoxのMaxWidthのためMultiBindingのを使用することができます

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