Silverlight 4: список не сжимается при уменьшении элементов - PullRequest
5 голосов
/ 24 июня 2010

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

Элементы могут увеличиваться / уменьшаться, поскольку элементы, содержащие текстовые поля, изменяют размер при вводе.

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

Наш злой список является частью UserControl, который содержит StackPanel с меткой (HorizontalAlignment =Центр), список (HA = слева) и кнопка (HA = справа).Элементы списка связаны с коллекцией ObservableCollection

Вы узнаете красивые BackgroundColors в ListBox и ListBoxItems.Я использовал их, чтобы можно было сказать, что Предметы, или сам список не уменьшается.Я обнаружил, что элементы сокращаются, но список не работает.

Хорошо, вот код моего UserControl:

<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left">
  <StackPanel.Background>
    <SolidColorBrush Color="{StaticResource ColorBasicDark}"/>
  </StackPanel.Background>

  <sdk:Label x:Name="LabelServiceName" FontSize="{StaticResource FontSizeMedium}" Margin="2" HorizontalAlignment="Center" Content="LabelServiceName">
    <sdk:Label.Foreground>
      <SolidColorBrush Color="{StaticResource ColorBasicLight}"/>
    </sdk:Label.Foreground>
  </sdk:Label>

  <ListBox x:Name="ListBoxCharacteristics" BorderBrush="{x:Null}" Margin="0" HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left">
    <ListBox.Foreground>
      <SolidColorBrush Color="{StaticResource ColorBasicLight}"/>
    </ListBox.Foreground>

    <!-- DataTemplate to display the content -->
    <ListBox.ItemTemplate>
      <DataTemplate>
        <StackPanel x:Name="StackPanelBorder" Orientation="Horizontal" HorizontalAlignment="Left">
          <TextBox x:Name="TextBoxCharacteristicName" Style="{StaticResource InputTextBox}" Text="{Binding Name}" />
          <TextBox x:Name="TextBoxSep" Style="{StaticResource ReadOnlyTextBox}" Text="=" />
          <TextBox x:Name="TextBoxFuncOrValue" Style="{StaticResource InputTextBox}" Text="{Binding Value.Text}" />
          <TextBox x:Name="TextBoxValue" Style="{StaticResource ReadOnlyTextBox}" />
          <Button x:Name="ButtonRemove" Style="{StaticResource BasicButtonStyle}" Content="-" Click="ButtonRemove_Click" />
        </StackPanel>
      </DataTemplate>
    </ListBox.ItemTemplate>

    <ListBox.ItemContainerStyle>
      <Style TargetType="ListBoxItem">
        <Setter Property="HorizontalAlignment" Value="Left" />
        <Setter Property="Background" Value="Yellow" />
      </Style>
    </ListBox.ItemContainerStyle>

    <ListBox.Background>
      <SolidColorBrush Color="Red" />
    </ListBox.Background>
  </ListBox>

  <Button x:Name="ButtonAddCharaDisplayObject" Style="{StaticResource BasicButtonStyle}" Content="+" HorizontalAlignment="Right" Click="ButtonAddCharaDisplayObject_Click" />
</StackPanel>

Понятия не имею, почему список не работаетПри уменьшении размера элементов я не уменьшаюсь, хотя я установил для размера списка значение Авто, а для параметра По горизонтали - влево

Заранее спасибо, Фрэнк

Ответы [ 2 ]

5 голосов
/ 07 января 2011

Я наконец нашел решение в этом посте . Проблема в том, что начиная с Silverlight 3, ListBox использует VirtualizationStackPanel для отображения ListItems. Помимо StackPanel, VirtualizationStackPanel использует все пространство, которое получает, и никогда не возвращает его. Таким образом, когда самый большой элемент в вашем списке сжимается, и поэтому сам ListBox может сжиматься, потому что теперь остается неиспользуемое пространство, ширина (и высота) ListBox все равно останется прежней, поскольку VirtualizationStackPanel не сжимается должным образом.

Чтобы исправить это, мы можем заставить ListBox использовать StackPanel вместо VirtualizationStackPanel. Обратите внимание, что это может происходить за счет производительности!

<ListBox HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 

    ... // other listbox related stuff

    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <StackPanel />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>

</ListBox> 
0 голосов
/ 24 июня 2010

Ну ... у меня нет всего твоего кода. Но я упростил то, что вы имели выше, и это работает.

Надеюсь, это поможет вам как-то выяснить вашу проблему. Еще раз, это может быть родитель этого элемента управления, вызывающий проблемы. Это также может быть один из ваших стилей, которые вы применяете. Попробуйте убрать ВСЕ из своего контроля, которого там не должно быть, затем медленно добавьте его обратно, чтобы найти виновника.

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

XAML:

<UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d"
    x:Class="Test.MainPage">

    <Grid x:Name="LayoutRoot">
        <StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"> 
          <StackPanel.Background> 
            <SolidColorBrush Color="Black"/> 
          </StackPanel.Background> 

          <ListBox x:Name="ListBox" BorderBrush="{x:Null}" Margin="0" HorizontalContentAlignment="Left" FontSize="9.333" HorizontalAlignment="Left"> 
            <ListBox.Foreground> 
              <SolidColorBrush Color="Silver"/> 
            </ListBox.Foreground> 

            <!-- DataTemplate to display the content --> 
            <ListBox.ItemTemplate> 
              <DataTemplate> 
                <StackPanelOrientation="Horizontal" HorizontalAlignment="Left"> 
                  <TextBox FontSize="30" Text="{Binding}" />      
                </StackPanel> 
              </DataTemplate> 
            </ListBox.ItemTemplate> 

            <ListBox.ItemContainerStyle> 
              <Style TargetType="ListBoxItem"> 
                <Setter Property="HorizontalAlignment" Value="Left" /> 
                <Setter Property="Background" Value="Yellow" /> 
              </Style> 
            </ListBox.ItemContainerStyle> 

            <ListBox.Background> 
              <SolidColorBrush Color="Red" /> 
            </ListBox.Background>   

          </ListBox> 

            <StackPanel Orientation="Horizontal" HorizontalAlignment="Right" Height="30">
                <Button Content="Add" Click="Add_Click" Width="100"/>
                <Button Content="Remove" Click="Remove_Click"  Width="100"/> 
            </StackPanel>  
        </StackPanel>       
    </Grid>
</UserControl>

Код сзади:

using System;
using System.Windows;
using System.Windows.Controls;

namespace Test
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            // Required to initialize variables
            InitializeComponent();

            Count = 8;
        }

        private int Count;

        private void Add_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            Count = Count * 8;

            ListBox.Items.Add("Hi Mom (" + Count.ToString() + ")");
        }

        private void Remove_Click(object sender, System.Windows.RoutedEventArgs e)
        {
            ListBox.Items.RemoveAt(ListBox.Items.Count-1);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...