Элементы управления Lookless с несколькими дочерними элементами в свойствах / частях (+ темы) - PullRequest
1 голос
/ 06 августа 2010

Я создал пользовательский элемент управления для MahTweets , который упрощает / унифицирует внешний вид каждого обновления для различных поддерживаемых нами обновлений социальных сетей.В теории это также упрощает создание тем для всего, потому что мы можем просто создать стиль для элемента управления без вида.У него есть несколько других свойств, но по большей части это не имеет значения.

Я пытаюсь создать «минимальную» тему, которая скрывает много деталей и т. Д., И все в порядке, пока я не получудо кнопок.Перемещая кнопки (по сетям, кнопки меняются - например, в Facebook нет кнопки «ретвит»), я хочу перейти от сетки к горизонтальной панели стека.Я хочу использовать элемент управления примерно так:

<MyControl>
    <MyControl.ContentPartOne>
        <Button/>
        <Button/>
        <Button/>
    </MyControl.ContentPartOne>
    <MyControl.ContentPartTwo>
        <stackpanel>
        ...
        </stackpanel>
    </MyControl.ContentPartTwo>
</MyControl>

Это позволило бы стилю / теме для пользовательского элемента управления определять расположение кнопок.Используя объект (и contentpresenter на стороне презентации), мне сказали, что объект может иметь только один дочерний элемент (поэтому они были заключены в сетку).Я пытался быть хитрым и сделать список, который он принимает , но не знает, как представить (поэтому он просто дает "(collection)", он же object.ToString ())

Что мне нужно в контрольном коде позади, чтобы принять список элементов пользовательского интерфейса (ala ListBox, Panels и т. Д.), И как мне представить его на стороне пользовательского интерфейса?

1 Ответ

1 голос
/ 06 августа 2010

То, что вы описываете, является стандартным шаблоном ItemsControl. ItemsControl принимает коллекцию объектов либо непосредственно через Items, либо через ItemsSource (в вашем случае - Buttons) и ItemsPanelTemplate, который определяет Panel для использования в макете (ваш StackPanel). При рендеринге ItemsPresenter ItemsControl затем вставляется в него ItemsPanel и заполняется элементами. В вашем случае ваши Предметы уже являются Элементами управления, поэтому они не будут обернуты ContentPresenters, так что вы даже можете использовать Grid, и он будет учитывать настройки Grid.Row и Grid.Column на ваших кнопках, поскольку они будут прямыми дочерними элементами.

<ItemsControl>
    <Button Content="1" Grid.Column="0"/>
    <Button Content="2" Grid.Column="1" Grid.Row="1"/>
    <Button Content="3" Grid.Column="2"/>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="50"/>
                    <ColumnDefinition/>
                    <ColumnDefinition Width="30"/>
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition/>
                    <RowDefinition Height="50"/>
                </Grid.RowDefinitions>
            </Grid>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
</ItemsControl>

Вы можете либо использовать ItemsControl напрямую (или HeaderedItemsControl для дополнительного фрагмента контента), либо извлечь из него информацию и добавить дополнительные функции.

...