Xaml альтернатива разметке сетки - PullRequest
0 голосов
/ 19 января 2010

Я использовал сетки для хранения элементов управления для нового приложения. Такие как;

<Grid Margin="5">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="150" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="Label1:" />
        <ListBox Grid.Row="0" Grid.Column="1" />                       

        <Label Grid.Row="1" Grid.Column="0" Content="Label2:" />
        <ComboBox Grid.Row="1" Grid.Column="1" />

        <Label Grid.Row="2" Grid.Column="0" Content="Label3:" />
        <TextBox Grid.Row="2" Grid.Column="1" />
    </Grid>

Это работает нормально, однако теперь у меня возникла ситуация, когда я хочу показать только третий ряд, основываясь на выбранном значении из выпадающего списка второго ряда.

С сеткой это кажется слишком грязным, чтобы установить видимость всего ряда, который нужно свернуть. Я думаю, что мне придется сделать это, установив высоту содержимого строки на ноль.

Есть ли более гибкая компоновка, чем у сетки. Я думал о канале стека, но не был уверен в наличии нескольких столбцов и синхронизации строк.

Вероятно, это действительно простой вопрос, но мне интересно узнать мнение других людей, прежде чем я что-нибудь сделаю.

1 Ответ

1 голос
/ 19 января 2010

Я бы не рекомендовал устанавливать высоту элементов управления на ноль - во-первых, все равно можно было бы перейти на элемент управления с 0-высотой, что, по меньшей мере, могло бы сбить пользователей с толку:)

В качестве альтернативы попробуйте связать видимость любых затронутых элементов управления с выбором комбинированного списка, например:

<UserControl xmlns:cnv="clr-namespace:your_namespace_here">
<Grid Margin="5">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>

    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="150" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>

    <Label Grid.Row="0" Grid.Column="0" Content="Label1:" />
    <ListBox Grid.Row="0" Grid.Column="1" />                       

    <Label Grid.Row="1" Grid.Column="0" Content="Label2:" />
    <ComboBox Name="cbo" Grid.Row="1" Grid.Column="1" />

    <Label Grid.Row="2" Grid.Column="0" Content="Label3:" 
        Visibility="{Binding ElementName=cbo, Path=SelectedIndex,
            Converter={cnv:IntToVisibilityConverter}}" />
    <TextBox Grid.Row="2" Grid.Column="1" />
</Grid>

В коде соберите конвертер, который возвращает соответствующий тип видимости:

namespace your_namespace_here
{
public class IntToVisibilityConverter : MarkupExtension, IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        int _value = (int)value;
        return (_value > 0) ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion

    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }
}
}

Обратите внимание, что в этом примере конвертер вернет Visiblity.Collapsed, если выбран первый элемент в комбинации, в противном случае Visiblity.Visible.

Неопробованный код, но метод звука. Надеюсь, что это полезно!

...