Создание сложных расчетов для ширины столбца сетки в WPF - PullRequest
1 голос
/ 01 февраля 2011

Можно ли создавать сложные вычисления для определения ширины столбцов (или любого элемента управления) в 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, или мне нужно будет использовать code-behind?

1 Ответ

3 голосов
/ 01 февраля 2011

Я не могу придумать способ сделать это строго в Xaml.
Вы можете использовать MultiBinding для MaxWidth TextBox, где вы используете следующее как 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();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...