Listboxitem没有正确对齐项目

时间:2009-11-11 14:59:00

标签: wpf layout alignment datatemplate listboxitem

好的,我得到了以下DataTemplate:

 Style="{StaticResource LBStyle}" HorizontalContentAlignment="Stretch">
                <ListBox.ItemTemplate>

                    <DataTemplate>
                        <Grid >
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="1*"/> 
                                <ColumnDefinition Width="100" />
                            </Grid.ColumnDefinitions>
                            <Label Content="{Binding Name}" x:Name="txt" Grid.Column="0"></Label>
                            <StackPanel Orientation="Vertical" Grid.Column="1">
                                <StackPanel Orientation="Horizontal">
                                    <TextBlock Text="{z:txt text=time}" Width="50">:</TextBlock>
                                    <TextBlock Text="{Binding Path=Value, Converter={StaticResource DecFix}}" />
                                </StackPanel>

                                <StackPanel Orientation="Horizontal" Width="50">
                                    <TextBlock Text="Norm.">:</TextBlock>
                                    <TextBlock Text="{Binding Path=NormaalWaarde, Converter={StaticResource DecFix}}" />
                                </StackPanel>
                            </StackPanel>
                        </Grid>

                        <DataTemplate.Triggers>
                            <DataTrigger Binding="{Binding IsCurrentStep}" Value="True">
                                <Setter TargetName="txt" Property="FontWeight" Value="Bold"/>
                            </DataTrigger> 
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </ListBox.ItemTemplate>

基本上我想要的是每个项目的左侧都有一些文本,它以列表框的宽度拉伸,右侧的2个值保持在右侧。 我已尝试过许多不同类型的面板,网格等等。而且它们似乎只是将右侧的值包裹在左侧的文本中,如下所示:

link text (请使用链接查看我的意思,我还不能发布图片)

如果我将相同的datatemplate独立放在其他地方,它就会做它应该做的事情。有没有人有建议?

编辑:我在列表框和窗口的其余部分之间放置了一个gridsplitter,看起来列表框正在无限延伸。这就是列表框在窗口中的其他元素之间的位置:(列表框位于tagger usercontrol中)

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="1*"/>
        <ColumnDefinition Width="2.5*"/>
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>           
        <RowDefinition/>
    </Grid.RowDefinitions>

    <vid:TagControl x:Name="Tagger" Grid.Column="0"></vid:TagControl>

    <GridSplitter ResizeDirection="Columns" Width="20" />

    <vid:DShowPlayer x:Name="DShowPlayer1" Grid.Column="1"></vid:DShowPlayer>
</Grid>

3 个答案:

答案 0 :(得分:1)

这里的问题当然与您的DataTemplate无关,或者您是否使用数据绑定。 ListBox或ListBoxItem样式或ControlTemplate中的某些内容导致控件在某个级别将Horizo​​ntalAlignment设置为“Stretch”。 (或者你可以使用在某种程度上忽略Horizo​​ntalAlignment的自定义测量或排列代码)

我怀疑你的Style="{StaticResource LBStyle}是罪魁祸首,或其他一些未显示的ListBox属性。

  • 默认的ListBox样式包含一个带有Border和ScrollViewer的模板,其中没有一个包含Horizo​​ntalAlignment设置
  • 默认的ListBox ItemsPanel模板由StackPanel组成,它也不包含Horizo​​ntalAlignment设置
  • 默认的ListBoxItem模板包含一个带有Border和ContentPresenter的模板。只有Border包含Horizo​​ntalAlignment设置,并且(通过样式设置器)将其设置为包含ListBox的Horizo​​ntalContentAlignment,您已将其设置为“Stretch”。

如果单独运行,您发布的代码运行正常。搜索您的样式(以及其他属性,代码隐藏设置等)以进行任何模板替换或覆盖默认Horizo​​ntalAlignment处理的设置。

如果问题最初不明显,请逐个删除设置,直至其停止工作,然后仔细查看您删除的内容。

答案 1 :(得分:0)

我可以找到的任何DataTemplate示例都没有明确说明,但出现是DataTemplates仅在列表项来自ItemsSource绑定时应用的情况。如果直接填充Items集合,则不使用DataTemplate。

在Expression Blend中添加ItemTemplate,命令文本显示“Generated Item Template” - 这似乎意味着模板仅在间接生成项目时使用。

我可以找到的每个示例都使用项目源的数据绑定。

答案 2 :(得分:0)

你应该使用Grid代替DockPanel 3列,第1列作为1 *,2和3作为固定长度......