1

好的,我得到了以下数据模板:

 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 个值,它保持在右侧。我已经尝试过使用许多不同类型的面板、网格等。它们似乎都只是将右侧的值放在一起包裹到左侧的文本中,如下所示:

链接文字 (请使用链接明白我的意思,我还不能发布图片)

如果我将相同的数据模板独立放在其他地方,它只会做它应该做的事情。有人有建议吗?

编辑:我在列表框和窗口的其余部分之间放置了一个gridsplitter,看起来列表框无限延伸。这是列表框在我的窗口中的其他元素中的定位方式:(列表框位于标记器用户控件中)

<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>
4

3 回答 3

1

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

我怀疑你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 处理的设置。

如果问题一开始并不明显,请一次删除一个设置,直到它停止工作,然后仔细查看您删除的内容。

于 2009-11-12T18:40:04.227 回答
0

您应该使用 Grid 而不是具有 3 列的 DockPanel,第 1 列为 1 * ,第 2 和第 3 列为固定长度...

于 2009-11-11T19:26:05.247 回答
0

我找不到任何 DataTemplate 示例明确说明这一点,但似乎只有当您的列表项来自 ItemsSource 绑定时,DataTemplates 才适用。如果您直接填充 Items 集合,则不会使用 DataTemplate。

在 Expression Blend 中添加一个 ItemTemplate,命令文本显示为“生成的项目模板”——这似乎意味着该模板仅在间接生成项目时使用。

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

于 2009-11-11T18:47:16.870 回答