Вопрос

У меня есть DockPanel, которую я динамически заполняет, используя элементыControl, чтобы заполнить панель. DockPanel нуждается в последнем ребенке из списка itemsControl, чтобы заполнить остальную часть панели, но, похоже, не произойдет, если я заполняю его в этой моде ... Что я могу сделать, чтобы получить этот последний товар для расширения?

Фрагмент того, как у меня он настроил: (обратите внимание, я установил фон докпанеля на синий, чтобы я мог отличить населенные элементы управления пользователем с фона панели)

        <DockPanel Background="Blue" LastChildFill="True" Margin="0">
        <ItemsControl ItemsSource="{Binding Requirements}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <local:TMGrid2View Baseline="{Binding}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </DockPanel>

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

Это было полезно?

Решение

Что происходит, в том, что ваша докпана заполнена элементамиControl. Все идет нормально. Однако itemsControl внутренне использует стекPanel, который не может заполнить вертикально (горизонтально, если установлено на ориентацию = «горизонтальный».

Редактировать: Чтобы объяснить фон синий ... Фон itemsControl по умолчанию установлен на NULL.

Знаете ли вы, сколько предметов в коллекции?

Редактировать2: Что вам нужно сделать, когда это динамическая коллекция, добавляет следующее:

<ItemsControl ...>
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <UniformGrid Columns="1"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <!-- rest of ItemsControl properties -->
</ItemsControl>

Единая сетка присваивает равное количество пространства для каждой ячейки как горизонтально, так и вертикально, так и на элементовPanel обменяет стандартную стекPanel для позиционирования.

Редактировать3: Работа с элементами неравной высоты ... пользовательская панель:

public class CustomPanel : StackPanel
{
    protected override Size ArrangeOverride(Size finalSize)
    {
        var childUIElements = Children.OfType<UIElement>().ToList();
        foreach (var child in childUIElements)
        {
            child.Measure(finalSize);
        }
        double remainingHeight = finalSize.Height - childUIElements.Sum(c => c.DesiredSize.Height);
        if(remainingHeight <= 0)
            return base.ArrangeOverride(finalSize);

        double yOffset = 0;
        foreach (var child in childUIElements)
        {
            double height = child.DesiredSize.Height + remainingHeight/childUIElements.Count;
            child.Arrange(new Rect(0,yOffset,finalSize.Width,height));
            yOffset += height;
        }
        return finalSize;
    }
}

Если я не сделал слишком много F.- UPS, которые должны делать не менее важную версию. Если предметы должны быть большие, чтобы быть большим, он работает как нормальный стекPanel - если нет, он устроит детей равномерно разделять оставшееся пространство равномерно между ними. Вы можете настроить его, чтобы назначить его по отношению, если вам это нужно (то есть. Большие блоки получают больше оставшегося пространства).

Последнее редактирование (я думаю :-)) Вам нужно поставить эту пользовательскую панель внутри элементовPaneltemplate вместо униформам, которую я предложил ранее.

Другие советы

Не ставьте ItemsControl в DockPanel; поставить DockPanel в ItemsControl. Отказ Использовать ItemsPanelTemplate сделать ItemsControl выложить свои предметы в DockPanel.

Использовать ItemContainerStyle установить DockPanel.Dock свойство на контейнерах элемента (который для ItemsControl, будет ContentPresenters).

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib">
  <ItemsControl Margin="5">
    <ItemsControl.ItemsPanel>
      <ItemsPanelTemplate>
        <DockPanel LastChildFill="True"/>
      </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemContainerStyle>
      <Style TargetType="ContentPresenter">
        <Setter Property="DockPanel.Dock" Value="Top"/>
      </Style>
    </ItemsControl.ItemContainerStyle>
    <ItemsControl.ItemTemplate>
      <DataTemplate>
        <TextBlock Background="Lavender" Margin="1" Padding="5" Text="{Binding}"/>
      </DataTemplate>
    </ItemsControl.ItemTemplate>
    <sys:String>Athos</sys:String>
    <sys:String>Porthos</sys:String>
    <sys:String>Aramis</sys:String>
    <sys:String>D'Artagnan</sys:String>
  </ItemsControl>
</Page>

Вы установили свойство DockPanel.Dock к стоимости, которую вы хотели?

Я выброшу раствор неелеганта:

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top