XAML: UniformGrid, где вы можете определить ячейки как не одинаковые по размеру? - PullRequest
0 голосов
/ 04 марта 2011

Как часть стиля ItemsControl я хотел бы иметь что-то, что работает как Grid/UniformGrid как ItemsPanel.

В простейшем виде Style будет выглядеть так:

<Style TargetType="{x:Type ItemsControl}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate>
                <ItemsPresenter />
            </ControlTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemsPanel">
        <Setter.Value>
            <ItemsPanelTemplate>
                <UniformGrid Columns="2" />
            </ItemsPanelTemplate>
        </Setter.Value>
    </Setter>
    <Setter Property="ItemContainerStyle">
        <Setter.Value>
            <Style>
                <Setter Property="Control.Margin" Value="10"/>
            </Style>
        </Setter.Value>
    </Setter>
</Style>

и я бы использовал это так:

<WrapPanel Orientation="Vertical">
            <ItemsControl>
                <TextBlock Text="Label1:"/>
                <TextBlock Text="ThisWillBeBound" />
            </ItemsControl>
            <ItemsControl>
                <TextBlock Text="Label2:"/>
                <TextBlock Text="ThisWillBeBound" />
            </ItemsControl>
                            <ItemsControl>
                <TextBlock Text="Label3:"/>
                <TextBlock Text="ThisWillBeBound" />
            </ItemsControl>
            <ItemsControl>
                <TextBlock Text="Label4:"/>
                <TextBlock Text="ThisWillBeBoundButIsSomewhatLongerThenTheOtherProperties" />
            </ItemsControl>
            <ItemsControl>
                <TextBlock Text="Label5:"/>
                <TextBlock Text="ThisWillBeBound" />
            </ItemsControl>
            <ItemsControl>
                <TextBlock Text="Label6:"/>
                <TextBlock Text="ThisWillBeBound" />
            </ItemsControl>
        </WrapPanel>

Как вы можете видеть, вы бы добавили Label для свойства в это плюс привязку к этому свойству, и они слиплись бы, даже если бы вещи обернулись вокруг, например, из-за разных размеров окна приложения.

Хорошая особенность UniformGrid в том, что кажется, что если один Label длиннее, другие получат одинаковое пространство, то есть связанные свойства будут выстроены аккуратно (почему это происходит, я не понимаю, потому что эти должен быть отдельным UniformGrid s, я думаю). Проблема здесь заключается в том, что ширина ячеек части Label и части Property одинакова, поэтому, если свойство длинное, между Label и Property.

будет большой разрыв.

Использование обычного Grid вместо этого означало бы, что мне придется устанавливать Grid.Column="0" и Grid.Column="1" везде, куда я помещаю предметы в ItemsControl. Это не совсем то, чем я не хочу.

Есть ли способ для меня иметь какую-то сетку, которая выстраивается в линию, как единая, но не разбивает все столбцы, когда нужно только, и предполагает, что вы помещаете в столбцы точно так же, как объявляете элементы?

1 Ответ

1 голос
/ 06 марта 2011

Я обычно видел сценарии такого рода, используя комбинацию Grid + IsSharedSizeScope + ListView + DataTemplate. В этом случае текст метки (т. Е. «Label1:») и текст записи (т. Е. «ThisWillBeBound») будут принадлежать одному типу элементов, а коллекция элементов этого типа будет привязана к представлению списка. Grid.IsSharedSizeScope позволяет обмениваться информацией о размере столбца между различными записями при использовании шаблона - очень удобно. Вот отличный пример этого на http://www.wpftutorial.net/DataTemplates.html. Это тот сценарий, который вы ищете?

...