Stretch ListBoxItem Проблемы со стилем - PullRequest
1 голос
/ 20 сентября 2010

У меня проблема с растягиванием содержимого ListBoxItem. Я использую DataTemplate с Grid, чтобы поместить содержимое последнего столбца выровненным справа. Но у меня должно быть что-то в базовом стиле элементов управления, которое предотвращает этот вид отображения - «*» («потребляют все остальное пространство») отображается как «auto» («берите только то, что вам действительно нужно»). 1004 *

Стиль всех ListBox es:

<Style TargetType="{x:Type ListBox}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="Background" Value="{DynamicResource WindowBackgroundBrush}" />
    <Setter Property="BorderBrush" Value="{DynamicResource SolidBorderBrush}" />
    <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
    <Setter Property="HorizontalContentAlignment" Value="Stretch" />
    <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
    <Setter Property="ScrollViewer.CanContentScroll" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
          <ControlTemplate TargetType="{x:Type ListBox}">
              <Grid HorizontalAlignment="Stretch">
                  <Border x:Name="Border" HorizontalAlignment="Stretch"
                          BorderBrush="{TemplateBinding BorderBrush}" 
                          BorderThickness="{TemplateBinding BorderThickness}" />
                  <ScrollViewer Margin="1" Style="{DynamicResource NuclearScrollViewer}"
                                Focusable="false" Background="{DynamicResource LightBrush}"
                                x:Name="scrollViewer">
                      <StackPanel Margin="2" IsItemsHost="true" HorizontalAlignment="Stretch" />
                  </ScrollViewer>
              </Grid>
              <ControlTemplate.Triggers>
                  <Trigger Property="IsEnabled" Value="false">
                      <Setter Property="Background"
                              Value="{DynamicResource DisabledBackgroundBrush}" 
                              TargetName="Border" />
                      <Setter Property="BorderBrush"
                              Value="{DynamicResource DisabledBorderBrush}" 
                              TargetName="Border" />
                      <Setter Property="Background"
                              TargetName="scrollViewer" 
                              Value="{DynamicResource DisabledBackgroundBrush}"/>
                  </Trigger>
                  <Trigger Property="IsGrouping" Value="true">
                      <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
                  </Trigger>
              </ControlTemplate.Triggers>
          </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
<Style d:IsControlPart="True" TargetType="{x:Type ListBoxItem}">
    <Setter Property="SnapsToDevicePixels" Value="true" />
    <Setter Property="OverridesDefaultStyle" Value="true" />
    <Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type ListBoxItem}">
            <Grid SnapsToDevicePixels="true" HorizontalAlignment="Stretch"  >
                <Border HorizontalAlignment="Stretch" x:Name="Border" Opacity="0.25" 
                        Margin="0,1,0,1" Background="{DynamicResource NormalBrush}" 
                        BorderBrush="{DynamicResource NormalBorderBrush}" 
                        BorderThickness="1,1,1,1" CornerRadius="0,0,0,0" Padding="0,0,0,0" />
                <Rectangle Opacity="0.25" Fill="{DynamicResource LightBrush}" Stroke="{x:Null}" 
                           Height="10.849" Margin="1.153,1.151,1,0" VerticalAlignment="Top" />
                <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
                                  Margin="5,2,0,2" x:Name="contentPresenter" />
            </Grid>
            <ControlTemplate.Triggers>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="Selector.IsSelected" Value="True"/>
                        <Condition Property="IsEnabled" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource DisabledBackgroundBrush}"/>
                    <Setter Property="BorderBrush" TargetName="Border"
                            Value="{DynamicResource DisabledBorderBrush}"/>
                </MultiTrigger>
                <Trigger Property="IsSelected" Value="true">
                    <Setter Property="Opacity" TargetName="Border" Value="1" />
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource SelectedBackgroundBrush}" />
                </Trigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsMouseOver" Value="True" />
                        <Condition Property="Selector.IsSelected" Value="False" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource MouseOverBrush}" />
                    <Setter Property="Opacity" TargetName="Border" Value="1" />
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="Selector.IsSelected" Value="True" />
                        <Condition Property="IsMouseOver" Value="True" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Opacity" TargetName="Border" Value="0.65" />
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource SelectedBackgroundBrush}" />
                </MultiTrigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsSelected" Value="true" />
                        <Condition Property="Selector.IsSelectionActive" Value="false" />
                    </MultiTrigger.Conditions>
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource SelectedBackgroundBrush}" />
                    <Setter Property="Opacity" TargetName="Border" Value="0.6" />
                </MultiTrigger>
                <Trigger Property="IsEnabled" Value="false">
                    <Setter Property="Foreground"
                            Value="{DynamicResource DisabledForegroundBrush}" />
                    <Setter Property="Background" TargetName="Border"
                            Value="{DynamicResource DisabledBackgroundBrush}"/>
                    <Setter Property="BorderBrush" TargetName="Border"
                            Value="{DynamicResource DisabledBorderBrush}"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
      </Setter.Value>
  </Setter>
</Style>

Мой ListBox:

<ListBox Height="220"
         DataContext="{Binding}"
         ItemsSource="{Binding Persons}"
         SelectedItem="{Binding SelectedPerson}"
         VirtualizingStackPanel.VirtualizationMode="Recycling" 
         VirtualizingStackPanel.IsVirtualizing="True"
         ScrollViewer.IsDeferredScrollingEnabled="True" 
         HorizontalAlignment="Stretch"
         HorizontalContentAlignment="Stretch" 
         ScrollViewer.HorizontalScrollBarVisibility="Disabled" 
         ScrollViewer.VerticalScrollBarVisibility="Auto"
         ScrollViewer.CanContentScroll="True">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Grid HorizontalAlignment="Stretch" 
                  MaxWidth="{Binding RelativeSource={RelativeSource
                                     Mode=FindAncestor,
                                     AncestorType={x:Type ListBox}},
                                     Path=ActualWidth}">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="Auto"/>
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto"/>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition Width="Auto"/>
                </Grid.ColumnDefinitions>
                <TextBlock Grid.Row="0" Grid.Column="0" Grid.RowSpan="2" 
                           Width="25" Height="25"
                           Margin="0,0,5,0" 
                           HorizontalAlignment="Right"
                           VerticalAlignment="Center"
                           Text="{Binding Path=BusinessDataObject.Category}">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Setter Property="TextAlignment" Value="Center"/>
                            <Setter Property="FontSize" Value="16"/>
                            <Setter Property="Foreground" Value="White"/>
                            <Setter Property="Background" Value="Transparent"/>
                            <Style.Triggers>
                                <Trigger Property="Text" Value="A">
                                    <Setter Property="Background" Value="Red"/>
                                </Trigger>
                                <Trigger Property="Text" Value="B">
                                    <Setter Property="Background" Value="Orange"/>
                                </Trigger>
                                <Trigger Property="Text" Value="C">
                                    <Setter Property="Background" Value="Blue"/>
                                </Trigger>
                            </Style.Triggers> 
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
                <TextBlock Grid.Row="0"
                           Grid.Column="1" 
                           Margin="0,0,10,0"
                           HorizontalAlignment="Left" 
                           TextWrapping="Wrap"
                           FontWeight="Bold"
                           Text="{Binding Path=BusinessDataObject.FullNameReversed}"/>
                <TextBlock Grid.Row="1" Grid.Column="1" Margin="0,0,10,0"
                           HorizontalAlignment="Left" 
                           Text="{Binding Path=BusinessDataObject.Position}"/>
                <TextBlock Grid.Row="0" Grid.Column="2" Margin="0,0,0,0"
                           HorizontalAlignment="Right"
                           TextAlignment="Left"
                           Text="{Binding Path=BusinessDataObject.Phone}"/>
                <TextBlock Grid.Row="1" Grid.Column="2" Margin="0,0,0,0"
                           HorizontalAlignment="Right"
                           TextAlignment="Left"
                           Text="{Binding Path=BusinessDataObject.Mobile}"/>
            </Grid>
        </DataTemplate>
    </ListBox.ItemTemplate>   
</ListBox>

Категория должна быть оставлена, Phone & Mobile должен быть справа, а Name & Position должен заполнить все оставшееся пространство. Похоже, что внутри Предметов нет «целого» пространства, хотя они оптически заполняют пространство ширины списков.

Может ли кто-нибудь мне помочь? Я схожу с ума по этому поводу. : - (

Редактировать: Изображение

1 Ответ

1 голос
/ 20 сентября 2010

Попробуйте установить для HorizontalContentAlignment для ListBoxItem значение Stretch. Что-то вроде в этой ссылке , за исключением использования ListBox и ListBoxItem:

...