2013-09-16 4 views
3

Я новичок в WPF. Я пытаюсь сделать первый столбец в шаблоне OrderItemsTmpl растягиваться до максимальной доступной ширины, но он не работает, ширина зависит только от ширины текста внутри. Я не хочу использовать абсолютное значение. Как это решить? БлагодаряWPF ListBoxItem не растягивается до максимальной ширины

<DataTemplate x:Key="OrderItemsTmpl"> 
      <Grid Background="Brown" HorizontalAlignment="Stretch" > 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="*"></ColumnDefinition> 
        <ColumnDefinition Width="auto"></ColumnDefinition> 
       </Grid.ColumnDefinitions> 

       <StackPanel Grid.Column="0" HorizontalAlignment="Stretch"> 
        <CheckBox Content="{Binding Path=sItemName}" HorizontalContentAlignment="Stretch" ></CheckBox> 
        <ListBox HorizontalContentAlignment="Stretch" 
         ItemsSource="{Binding Path=aSinglOptns}" 
         Margin="20,0,0,0" 
         ItemTemplate="{StaticResource SinglOptnTmpl}" 
         Style="{StaticResource SheetListStyle}" 
         ItemContainerStyle="{StaticResource ListBoxItemStyle}" 
       > 

        </ListBox> 
       </StackPanel> 

       <TextBlock Grid.Column="1" Text="{Binding Path=fQty}"></TextBlock> 
</DataTemplate> 

<Style x:Key="ListBoxItemStyle" TargetType="{x:Type ListBoxItem}"> 
      <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="ListBoxItem"> 
         <ContentPresenter></ContentPresenter> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 


<Style x:Key="SheetListStyle" TargetType="{x:Type ListBox}"> 
      <Setter Property="Background" Value="Aqua"></Setter> 

      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ListBox}"> 
         <Border 
          CornerRadius="8" 
          BorderThickness="2"> 
          <ScrollViewer> 
           <WrapPanel 
            IsItemsHost="True" 
            Orientation="Vertical" 
            HorizontalAlignment="Left"/> 
          </ScrollViewer> 
         </Border> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 

ListBox, что содержание пункт

<Grid Background="Pink" Grid.Row="1" > 
         <Grid.RowDefinitions> 
          <RowDefinition Height="auto"></RowDefinition> 
          <RowDefinition Height="*"></RowDefinition> 
         </Grid.RowDefinitions> 
         <Grid.ColumnDefinitions> 
          <ColumnDefinition Width="*"></ColumnDefinition> 
         </Grid.ColumnDefinitions> 

         <TextBlock HorizontalAlignment="Center" Text="{Binding Path=sDita}" Grid.Row="0" Grid.Column="0" TextWrapping="Wrap" ></TextBlock> 

         <ListBox 
           Grid.Row="1" 
           Grid.Column="0" 
           HorizontalContentAlignment="Stretch" 
           Background="Aqua" 
           ItemsSource="{Binding Path=aOrderItems}" 
           Name="OrderItems" 
           ItemTemplate="{StaticResource OrderItemsTmpl}" 
           Margin="0,0,0,0" 
           ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
           ScrollViewer.VerticalScrollBarVisibility="Auto" 
           ScrollViewer.CanContentScroll="True" 
           ItemContainerStyle="{StaticResource ListBoxItemStyle}" 
           Style="{StaticResource SheetListStyle}"> 

         </ListBox> 
        </Grid> 

UPDATE я понял из <Style x:Key="SheetListStyle"> Я использую WrapPanel, он не будет растягиваться до максимальной ширины, даже применить HorizontalAlignment = "Stretch « Вместо этого я должен использовать другую панель, но кто-нибудь знает, что можно использовать?

ответ

3

Проблема заключается в шаблоне управления ListBox. Вы используете WrapPanel, и вы выравниваете его влево. Используйте StackPanel и позволить ему растягиваться (по умолчанию):

   <ControlTemplate TargetType="{x:Type ListBox}"> 
        <Border 
         CornerRadius="8" 
         BorderThickness="2"> 
         <ScrollViewer> 
          <StackPanel 
           IsItemsHost="True" 
           Orientation="Vertical" /> 
         </ScrollViewer> 
        </Border> 
       </ControlTemplate> 

В качестве альтернативы можно использовать ItemsPresenter управления вместо панели непосредственно. ListBox по умолчанию использует VirtualizingStackPanel, что также даст вам виртуализацию (которую вы отключили).

8

Это смешно ... Я просто ответил это кому-то другому, но наоборот. В любом случае, чтобы ответить на ваш вопрос напрямую, на большинстве элементов управления коллекцией есть свойство, которое позволяет выбрать целую строку, и я подозреваю, что вам необходимо установить . Если вы не установили свойство HorizontalContentAlignment в Stretch, то , что является вашей проблемой.

Ahhh ... У меня есть только заметил, что вы сделал установить эту собственность.

Хорошо, давайте еще поедем ... Я вижу, что вы используете StackPanel внутри своего OrderItemsTmplDataTemplate. Эти элементы управления не влияют на Width их детей, поэтому я думаю, что , что ваша проблема связана с. Попробуйте вместо этого изменить его на другой элемент управления Grid.

+0

Привет, спасибо за помощь. Я преобразовал стекную панель в сетку, но все же она не работает, растягиваясь до максимальной ширины. – William

+1

Спасибо. HorzontalContentAlignment = «Stretch» ​​- это ответ, который решил мою проблему. –

+0

О, черт возьми! Не могу поверить, что я не думал об этом в первую очередь. Спасибо! –

5

Пожалуйста, см here

Я уверен, что это дубликат, но я не могу найти вопрос с таким же ответом.

Добавить HorizontalContentAlignment = "Stretch" в ваш ListBox. Это должно делать свое дело.

+0

Это то, что мне помогает. Благодаря! – psulek

Смежные вопросы