2015-01-15 3 views
1

Я думаю, что заголовок не ясен Я работаю с WPF и создаю custom Messages control. У меня есть message User Control, а элементы управления сообщениями отображаются в custom Messages control [ListBox]. Код XAML:WPF: ListBox item show from bottom to top

<ListBox x:Name="uiMessages" ItemsSource="{Binding Path=Messages}"> 
      <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <WrapPanel Orientation="Horizontal" IsItemsHost="True" /> 
       </ItemsPanelTemplate> 
      </ListBox.ItemsPanel> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <wpfMessages:MessageDisplay> 

        </wpfMessages:MessageDisplay> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
</ListBox> 

Текущий вид:

enter image description here

Ожидаемое:

enter image description here

Теперь элемент списка теперь отображается сверху вниз, а после красного сообщения - пустое место. Я буду хорош, если два зеленых сообщения будут внизу внизу, а красный - сверху. Ожидается добавление сообщений от botton to top no сверху до botton, как сейчас. enter image description here

любые идеи?

Заранее благодарен Jamaxack!

+0

Чтобы уточнить, желаемый результат - это панель обертывания, которая заполняет правую верхнюю левую горизонталь и обертывает вверх. –

ответ

2

создания пользовательских WrapPanel, который переворачивает элементы

XAML код:

<ListBox x:Name="uiMessages" ScrollViewer.HorizontalScrollBarVisibility="Disabled"> 
     <ListBox.ItemsPanel> 
       <ItemsPanelTemplate> 
        <wpf:ReverseWrapPanel Orientation="Horizontal"/> 
       </ItemsPanelTemplate> 
     </ListBox.ItemsPanel> 
    </ListBox> 

код за:

public class ReverseWrapPanel : WrapPanel 
    { 
     public new Orientation Orientation { get { return base.Orientation; } set { base.Orientation = value; ResetAll(); } } 

     /// <summary> 
     /// The opposite of the Orientation property. 
     /// </summary> 
     Orientation FlipDirection { get { return Orientation == Orientation.Horizontal ? Orientation.Vertical : Orientation.Horizontal; } } 

     public ReverseWrapPanel() 
     { 
      Initialized += ReverseWrapPanel_Initialized; 
     } 

     void ReverseWrapPanel_Initialized(object sender, System.EventArgs e) 
     { 
      this.Mirror(FlipDirection); 
     } 

     protected override void OnVisualChildrenChanged(DependencyObject visualAdded, DependencyObject visualRemoved) 
     { 
      base.OnVisualChildrenChanged(visualAdded, visualRemoved); 

      foreach (UIElement child in Children.OfType<UIElement>()) 
      { 
       child.Mirror(FlipDirection); 
      } 
     } 

     void ResetAll() 
     { 
      this.Mirror(FlipDirection); 

      foreach (UIElement child in Children.OfType<UIElement>()) 
      { 
       child.Mirror(FlipDirection); 
      } 
     } 
    } 

Thanx Джамшед!

3

Немного непонятно, но я думаю, вы хотите изменить Layout Layout.

<ListBox.ItemsPanel> 
    <ItemsPanelTemplate> 
     <VirtualizingStackPanel VerticalAlignment="Bottom"/> 
    </ItemsPanelTemplate> 
</ListBox.ItemsPanel> 
+0

Спасибо за ваш ответ, но мне нужен WrapPanel, если сообщений больше 3, чем я не вижу других сообщений в панели стека, обертывания панелей и добавляет к сообщениям второй строки, которые я не вижу – Jamaxack

+0

Из msdn «Последующее упорядочение происходит последовательно из сверху вниз или справа налево в зависимости от ориентации ». Следовательно, вы застряли сверху вниз. Вы можете либо написать свой собственный элемент управления, либо просто изменить связанный набор элементов, чтобы при добавлении элемента вы добавляли его в начало, а не в конец коллекции. Подсказка: используйте стек = P –

+1

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