2010-06-24 7 views
5

에서 this question으로 줄어들지 않을 때 Listbox-Items가 축소 될 때 크기가 조정되지 않는 목록 상자로 드릴 다운했습니다. 따라서 항목의 크기가 커지면 크기가 조정되지만 항목의 크기가 작아지면 축소되지 않습니다.Silverlight 4 : 목록 상자가 축소되어

입력란의 크기가 조정되는 텍스트 상자를 포함하는 항목 때문에 항목이 커질 수 있습니다.

우리의 악한 목록 상자는 라벨 (HorizontalAlignment로 = 센터), 목록 상자에 StackPanel에 포함 된 UserControl을의 일부입니다 :

예레미야는 그래서 여기에 우리가 가서 보여 더 많은 코드와 새 질문을 시작하는 제안 (HA = 왼쪽) 및 버튼 (HA = 오른쪽). 목록 상자 항목이 ObservableCollection에 데이터 링크됩니다.

ListBox 및 ListBoxItem의 아름다운 BackgroundColors를 인식합니다. Items 나 Listbox 자체가 축소되지 않는다고 말할 수있게하기 위해 그것들을 사용했습니다. Items가 줄어들지 만 Listbox는 그렇지 않다는 것을 알았습니다.

좋아, 여기 내 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> 

내가 항목의 크기가 축소 될 때 목록 상자가 축소되지 않는 이유를 아무 생각 나는 자동으로 목록 상자 '크기를 설정하고 있지만 및 HorizontalAlignment로는 음 ... 난 당신의 모든 코드가없는, 사전에 프랭크

답변

5

가 마침내 this post에 해결책을 발견했다. 문제는 Silverlight 3부터는 ListBox가 VirtualizationStackPanel을 사용하여 ListItem을 표시한다는 것입니다. StackPanel 외에도 VirtualizationStackPanel은 가져 오는 모든 공간을 사용하며 은 결코으로 반환합니다. 그래서리스트에서 가장 큰 항목이 줄어들면 ListBox 자체는 사용되지 않은 공간이 있기 때문에 축소 될 수 있습니다. ListBox의 너비와 높이는 VirtualizationStackPanel이 적절하게 축소되지 않기 때문에 여전히 동일하게 유지됩니다.

이 문제를 해결하기 위해 ListBox가 VirtualizationStackPanel 대신 StackPanel을 사용하도록 할 수 있습니다. 성능 저하를 초래할 수 있습니다!

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

    ... // other listbox related stuff 

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

</ListBox> 
+0

이 솔루션을 자신의 질문에 게시하는 데 시간을내어 주셔서 감사합니다. 나는 똑같은 문제를 겪고 있었고 위대한 일을했습니다! –

0

감사를 왼쪽으로. 그러나, 나는 당신이 위에 가지고있는 것을 단순화 시켰고 그것이 작동합니다.

이 방법으로 문제를 파악하는 데 도움이되기를 바랍니다. 다시 한번, 문제를 일으키는 원인이되는이 통제의 부모가 될 수 있습니다. 또한 신청하는 스타일 중 하나 일 수도 있습니다. 거기에있을 필요가없는 컨트롤에서 모든 것을 제거한 다음 천천히 다시 추가하여 범인을 찾으십시오.

새로운 실버 라이트 애플리케이션을 만들었습니다.이 애플리케이션은 말 그대로 문자 그대로의 것입니다. 목록 상자는 예상대로 커지고 축소됩니다.

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); 
     } 
    } 
} 
+0

아직 문제가 해결되지 않았지만 최우선 순위는 아니기 때문에 다른 기능이 구현 될 때까지 보류 중입니다.내가 생각한 한 가지는 UC의 부모는 캔버스이지만 그리드에 배치하면 문제는 그대로 유지됩니다. 어떻게 든 끝내면 다시보고 할 것입니다. – Aaginor

+0

내 테이블에서이 문제가 다시 발생하여 요소 크기가 변경 될 때 항목 목록이 변경 될 때 목록 상자가 축소되지 않고 목록 상자에서 내용이 새로 렌더링 될 가능성이 있음을 발견했습니다. 그러나 텍스트를 삭제하여 가장 큰 행의 크기를 변경하는 경우 항목을 추가하거나 제거 할 때 목록 상자의 크기 만 축소됩니다 – Aaginor