【问题标题】:Silverlight 3: ListBox DataTemplate HorizontalAlignmentSilverlight 3:ListBox DataTemplate Horizo​​ntalAlignment
【发布时间】:2010-10-19 06:32:57
【问题描述】:

我有一个 ListBox,它的 ItemTemplate 绑定到 DataTemplate。我的问题是我无法让模板中的元素拉伸到 ListBox 的整个宽度。

<ListBox x:Name="listPeople" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" 
    Margin="0,0,0,0" Background="{x:Null}" SelectionMode="Extended" Grid.Row="1" 
    ItemTemplate="{StaticResource PersonViewModel.BrowserDataTemplate}" 
    ItemsSource="{Binding Mode=OneWay, Path=SearchResults}" >
</ListBox>

<DataTemplate x:Key="PersonViewModel.BrowserDataTemplate">
   <ListBoxItem HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
     <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Margin="5,5,5,5">
       <Border Opacity=".1" x:Name="itemBorder"  Background="#FF000000"   
         HorizontalAlignment="Stretch" VerticalAlignment="Stretch" 
         CornerRadius="5,5,5,5" MinWidth="100" Height="50"/>
      </Grid>
   </ListBoxItem>
</DataTemplate>

如您所见,我在网格中添加了一个边框来指示模板的宽度。我的目标是看到这个边框扩展到列表框的整个宽度。目前它的宽度由它的内容或 MinWidth 决定,这是目前唯一让它保持可见的东西。

【问题讨论】:

  • 我确定这已经出现过,所以我应该知道答案,但是:Silverlight 的 ListBox 是否有 Horizo​​ntalContentAlignment 属性?如果是这样,那就是您要设置为“拉伸”的那个。
  • 您需要将 ListBoxItem(而不是 ListBox)上的 Horizo​​ntalContentAlignment 属性设置为“Stretch”。

标签: silverlight listbox datatemplate controltemplate


【解决方案1】:

我正在使用带有 VS 2012 的 Silverlight 5。我遇到了同样的问题。我有水平列表框,其中包含我自己的自定义对象作为 ItemsSource。我想要扩展列表框项目。但它们并没有扩大。我不想为每个列表框项目提供任何硬编码宽度。我在这里尝试了所有答案,但没有任何效果。我刚刚给了 ItemsSource ={Binding Persons} DisplayMemberPath="First Name"。就这些

【讨论】:

    【解决方案2】:

    我的 ListBoxItem 包含一个 CheckBox 并且上述解决方案对我不起作用(很可能是由于 CheckBox 的性质,而不是那些解决方案)我能够通过不绑定到“内容”属性来强制执行此功能复选框,但明确定义 XAML 内联:

    <CheckBox HorizontalAlignment="Stretch" IsChecked="{Binding Path=IsSelected, Mode=TwoWay}">
        <TextBlock
            MinWidth="130"
            Margin="0,-2,0,0"
            HorizontalAlignment="Stretch"
            Text="{Binding Path=DisplayText}" />
    </CheckBox>
    

    需要边距,因为 TextBox 文本未与 CheckBox 的复选标记对齐。 MinWidth 也是必需的。

    【讨论】:

      【解决方案3】:

      Here 是使用列表框控件的控件模板和数据模板的示例。请参阅 XAML 标记,该标记使列表框项的边框变宽。

      【讨论】:

      • 我也被告知尝试 Horizo​​ntalContentAlignment="Stretch" 但不幸的是它并没有帮助我。但幸运的是,上面的这个链接(搜索拉伸),将 xaml 放入我的 确实像一个魅力!谢谢。
      【解决方案4】:

      为 ListBox 创建数据模板时,不应包含 &lt;ListBoxItem&gt;。 DataTemplate 的内容将放置在生成的容器内。您可以使用 ItemContainerStyle 控制该容器的构造方式。

      ListBoxItem 的默认控件样式默认用于定义ItemContainerStyle。此样式将 ListBoxItem.Horizo​​ntalContentAlignment 属性设置为“左”。请注意 ContentPresenter 如何将其 Horizo​​ntalAlignment 绑定到此属性。

      您需要覆盖在绑定到 ListBox 时生成的 ListBoxItem 容器的样式。这可以通过设置 ItemContainerStyle 来完成。将 Horizo​​ntalContentAlignment 属性设置为“Stretch”。

      下面是默认的 ListBoxItem 样式。供参考。

      <Style x:Key="ListBoxItemStyle1" TargetType="ListBoxItem">
                  <Setter Property="Padding" Value="3"/>
                  <Setter Property="HorizontalContentAlignment" Value="Left"/>
                  <Setter Property="VerticalContentAlignment" Value="Top"/>
                  <Setter Property="Background" Value="Transparent"/>
                  <Setter Property="BorderThickness" Value="1"/>
                  <Setter Property="TabNavigation" Value="Local"/>
                  <Setter Property="Template">
                      <Setter.Value>
                          <ControlTemplate TargetType="ListBoxItem">
                              <Grid Background="{TemplateBinding Background}">
                                  <!-- VSM excluded for readability -->
                                  <Rectangle x:Name="fillColor" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
                                  <Rectangle x:Name="fillColor2" Fill="#FFBADDE9" RadiusX="1" RadiusY="1" IsHitTestVisible="False" Opacity="0"/>
                                  <ContentPresenter x:Name="contentPresenter" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
                                  <Rectangle x:Name="FocusVisualElement" Stroke="#FF6DBDD1" StrokeThickness="1" RadiusX="1" RadiusY="1" Visibility="Collapsed"/>
                              </Grid>
                          </ControlTemplate>
                      </Setter.Value>
                  </Setter>
              </Style>
      

      【讨论】:

      • 谢谢!这正是我所需要的!
      【解决方案5】:

      我花了一个小时试图解决这个问题。非常非常令人沮丧。您不必覆盖 ListBoxItem 的整个默认样式。我无法让它工作。最后,我通过简单地覆盖 ListBox.ItemContainerStyle 部分中的 Horizo​​ntalContentAlignment 属性解决了这个问题,例如:

                  <ListBox x:Name="ClassList" ItemsSource="{Binding LineClasses}"
                           ScrollViewer.VerticalScrollBarVisibility="Visible"
                           SelectionMode="Extended"
                           ScrollViewer.HorizontalScrollBarVisibility="Hidden" HorizontalContentAlignment="Stretch"
                           HorizontalAlignment="Stretch" Loaded="ClassList_Loaded"
                           VerticalAlignment="Stretch" Grid.Row="0">
                      <ListBox.ItemContainerStyle>
                          <Style TargetType="ListBoxItem">
                              <Setter Property="HorizontalContentAlignment" Value="Stretch"></Setter>
                          </Style>
                      </ListBox.ItemContainerStyle>
                          <ListBox.ItemTemplate>
      
                          <DataTemplate>
                              <Border BorderBrush="Black" CornerRadius="3" Background="#FFE88D34"
                                  BorderThickness="1" HorizontalAlignment="Stretch" >
                                  <Grid Background="Transparent" HorizontalAlignment="Stretch" >
                                      <Grid.ColumnDefinitions>
                                          <ColumnDefinition Width="*" />
                                      </Grid.ColumnDefinitions>
                                      <TextBlock 
                                          Grid.Column="0" HorizontalAlignment="Stretch"
                                          Margin="2"                                   
                                          FontSize="10"
                                          Text="{Binding DisplayClassNm}"/>
                                  </Grid>
      
                              </Border>
                          </DataTemplate>
                      </ListBox.ItemTemplate>
      

      这对我来说是一种享受。

      迈尔斯

      【讨论】:

      • 这些行: ... 为我工作,干净简单...
      • 我不主张重写 ListBoxItem 的整个控件模板。在我的回答中,我给出了与您完全相同的指导:“在 ListBox 的 ItemContainerStyle 上设置 Horizo​​ntalContentAlignment 属性”。我只是提供了更多关于 WHY 的机制以及它是如何工作的信息。
      • 帮了我很多。有趣的是stackoverflow.com/a/2924249/868227 有更多的支持...
      • 优秀的答案,它适用于 ListView。唯一的答案是帮助我在我的列表视图中使用自定义控件。
      【解决方案6】:

      我在这里注意到了两件事,因为我遇到了同样的问题,但无法按照您尝试的方式解决。

      首先,您不需要在 DataTemplate 中显式放置 ListBoxItem。这是自动为您创建的,因此您实际上将 ListBoxItem 包含在为您创建的项目中。我在Snoop 中查看了这一点以确认。

      其次,我不知道具体原因,但我也无法从对齐属性中获得拉伸行为。我将其更改为使用 Width 属性上的 RelativeSource 绑定到包含 ListBoxItem 的 ActualWidth 属性。这对我有用。

      Width="{Binding RelativeSource={RelativeSource 
         AncestorType={x:Type ListBoxItem}}, Path=ActualWidth}"
      

      如果您需要在为您隐式创建的 ListBoxItem 上设置样式属性,请在 ListBox.ItemContainerStyle 元素中使用 Style 元素。

      希望这会有所帮助...

      【讨论】:

      • 我不相信 Silverlight 中提供了 RelativeSource。
      • 你说得对……我没想到。您可以在 SL3 中进行 Element-to-Element 绑定,因此只需将 Grid 的 Width 绑定到 ListBox 的 ActualWidth 等。如果由于填充或类似的原因它有点偏离,您可以使用 IValueConverter 来修复它.
      • 你有更多的示例代码吗?我正在使用 WPF,并且我有一个 ListBox 设置,其中 DataTemplate 配置了一个网格。我也有 ListBox.ItemContainerStyle 设置,其中 Template 和 Horizo​​ntalContentAlignment 设置为 Stretch 但这并不能解决问题。我希望我可以像您在上面的示例代码中那样将 RelativeBinding 放在 ActualWidth 上。
      • 我尝试使用
      猜你喜欢
      • 2019-01-26
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-21
      • 2010-09-21
      相关资源
      最近更新 更多