【问题标题】:Top Alignment inside WPF ListBox WPF XAMLWPF ListBox WPF XAML 内的顶部对齐
【发布时间】:2015-03-10 13:28:27
【问题描述】:

我在 WPF 窗口中顶部对齐堆栈面板/网格时遇到问题。 关于我做错了什么的任何想法?当我尝试在列表框中顶部对齐内容时似乎正在发生这种情况,该列表框使用水平对齐的堆栈面板显示项目。

如果我将包含 ItemsSource = {Binding BoardMarkerRows} 的 ListBox 的网格的高度设置为 1400,则对齐开始正常工作(但我希望此网格具有自动高度)。

显示对齐关闭的屏幕截图:

这是我的 XAML

    <Viewbox Grid.ColumnSpan="2" VerticalAlignment="Top">
        <StackPanel   VerticalAlignment="Top">

            <StackPanel Name="StackPanelOptions">
                <StackPanel  Orientation="Horizontal ">
                    <Button Content="Init" HorizontalAlignment="Left" Margin="2" VerticalAlignment="Top" Width="75" Click="Init"/>
                    <Button Content="Rotate" HorizontalAlignment="Left" Margin="2" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
                    <Button Content ="Start" Command="{Binding BoardMarkerStartUpdatesCommand}"  Margin="2"/>
                    <Button Content ="Hide"  Name="ButtonHideHeader"  Margin="2" Click="ButtonHideHeader_Click"/>




                    <TextBlock Margin="2">
                        <TextBlock.Text>
                            <MultiBinding StringFormat="Status: {0}">
                                <Binding Path="BoardMarker.Status"  />
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                    <TextBlock Margin="2">
                        <TextBlock.Text>
                            <MultiBinding StringFormat="{}{0} Columns">
                                <Binding Path="BoardMarker.BoardMarkerColumns.Count "  />
                            </MultiBinding>
                        </TextBlock.Text>
                    </TextBlock>
                    <TextBox Height="24" TextWrapping="Wrap" Text="{Binding BoardMarker.MaximumResultDate}" Width="271"/>
                    <CheckBox Content="Use Maximum Result Date" IsChecked="{Binding BoardMarker.UseMaximumResultDate}"/>
                    <Label Content="Number Rows"/>
                    <TextBox Height="24" TextWrapping="Wrap" Margin="2" Text="{Binding BoardMarker.BoardMarkerSettings.NumberRowsPerColumn}" Width="50"/>

                    <Label Content="Days Offset"/>
                    <TextBox Height="24" TextWrapping="Wrap" Margin="2" Text="{Binding BoardMarker.DaysOffset}" Width="50"/>


                </StackPanel>
                <StackPanel Orientation="Horizontal">
                    <Label Content="Show All Runners"/>
                    <TextBox Height="24" TextWrapping="Wrap" Margin="2" Text="{Binding BoardMarker.ShowAll}" Width="300"/>


                </StackPanel>


            </StackPanel>


            <StackPanel Orientation="Vertical " VerticalAlignment="Top">
                <StackPanel >
                    <Viewbox VerticalAlignment="Top" Stretch="Uniform">

                        <ListBox ItemsSource ="{Binding BoardMarker.BoardMarkerColumns}"  Height="Auto" Width="Auto">
                            <ListBox.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel Orientation="Horizontal" VerticalAlignment="Top"/>
                                </ItemsPanelTemplate>
                            </ListBox.ItemsPanel>

                            <ListBox.ItemTemplate>
                                <DataTemplate>

                                    <Grid VerticalAlignment="Top">
                                        <ListBox  Height="Auto" 
                                    ItemsSource="{Binding .BoardMarkerRows}" Margin="5" Width="Auto" HorizontalAlignment="Stretch">

                                            <ListBox.ItemTemplate>
                                                <DataTemplate>

                                                    <Grid >


                                                        <Grid Height="Auto" Background="LightGreen" Width="180"  Visibility="{Binding ConverterParameter=ArkleEvent 
                                                    , Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}" VerticalAlignment="Top" >
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="75"/>
                                                                <ColumnDefinition Width="*"/>
                                                            </Grid.ColumnDefinitions>

                                                            <!--<TextBlock Text="{Binding RowType}" />-->
                                                            <TextBlock Text="{Binding ArkleEvent.Name}" Margin="2" Width="Auto" Height="Auto" FontWeight="Bold" />
                                                            <TextBlock Grid.Column="1" HorizontalAlignment="Right" Text="{Binding ArkleEvent.Going}" Margin="2" Width="Auto" Height="Auto" />
                                                        </Grid>





                                                        <Grid Background="LightBlue" HorizontalAlignment="Left" Height="Auto" VerticalAlignment="Top" Width="180"
                                                              Visibility="{Binding ConverterParameter=ArkleMarket, Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">
                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="110"/>
                                                                <ColumnDefinition Width="*"/>
                                                            </Grid.ColumnDefinitions>

                                                            <TextBlock Grid.Column="0" HorizontalAlignment="Left" FontWeight="Bold">
                                                                <TextBlock.Text>
                                                                    <MultiBinding StringFormat="{}{0:HH:mm} {1}">
                                                                        <Binding Path="ArkleMarket.ExpectedOffDate"  />
                                                                        <!--<Binding Path="RowType" />-->
                                                                        <Binding Path="ArkleMarket.RaceLength"  />
                                                                    </MultiBinding>
                                                                </TextBlock.Text>
                                                            </TextBlock>



                                                            <TextBlock Grid.Column="1" HorizontalAlignment="Right">
                                                                <TextBlock.Text>
                                                                    <MultiBinding StringFormat=" {0} Run {1} NR">
                                                                        <Binding Path="ArkleMarket" Converter="{StaticResource ArkleMarketToNumberRunnersConverter}" ConverterParameter="StillRunning"  />
                                                                        <!--<Binding Path="RowType" />-->
                                                                        <Binding Path="ArkleMarket" Converter="{StaticResource ArkleMarketToNumberRunnersConverter}" ConverterParameter="NR"  />
                                                                        <!--<Binding Path="ArkleMarket" Converter="{StaticResource ArkleMarketToNumberRunnersConverter}" ConverterParameter=",ConverterParameter=NR />-->
                                                                    </MultiBinding>
                                                                </TextBlock.Text>
                                                            </TextBlock>


                                                        </Grid>


                                                        <TextBlock Text="---------------------------------"  Margin="0,-3,0,-3" Foreground="DodgerBlue"
                                                                     Visibility="{Binding ConverterParameter=ArkleSelectionStaticFirst,
                                                            Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}"/>

                                                        <Grid 
                                                            Visibility="{Binding ConverterParameter=ArkleSelectionStatic,
                                                            Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">

                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="88"/>
                                                                <ColumnDefinition Width="35"/>
                                                                <ColumnDefinition Width="38"/>
                                                            </Grid.ColumnDefinitions>
                                                            <!--<TextBlock Text="{Binding RowIndex}" Margin="2" Width="Auto" Height="Auto" />-->
                                                            <TextBlock Grid.Column="0" Text="{Binding ArkleSelection.SelectionNumber,StringFormat={}{0:00}}" Margin="2" Width="15" />
                                                            <TextBlock Grid.Column="1" Text="{Binding ArkleSelection.Name}" Margin="2" Width="100" />
                                                            <TextBlock Grid.Column="2" Text="{Binding ArkleSelection.PriceCurrent}" Margin="2" Width="Auto" HorizontalAlignment="Right" />
                                                            <TextBlock Grid.Column="3" Text="{Binding ArkleSelection.OpeningPrice}" Margin="2" Width="Auto" Foreground="DarkGray" HorizontalAlignment="Right"  TextDecorations="Strikethrough" />


                                                        </Grid>





                                                        <Grid Visibility="{Binding ConverterParameter=ArkleSelectionRotating, Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">

                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="88"/>
                                                                <ColumnDefinition Width="35"/>
                                                                <ColumnDefinition Width="38"/>
                                                            </Grid.ColumnDefinitions>


                                                            <!--<TextBlock Text="{Binding RowIndex}" Margin="2" Width="Auto" Height="Auto" />-->
                                                            <TextBlock Grid.Column="0" Text="{Binding ArkleSelection.SelectionNumber,StringFormat={}{0:00}}" Margin="2" Width="15" />
                                                            <TextBlock Grid.Column="1" Text="{Binding ArkleSelection.Name}" Margin="2" Width="100" />
                                                            <TextBlock Grid.Column="2" Text="{Binding ArkleSelection.PriceCurrent}" Margin="2" Width="Auto" HorizontalAlignment="Right" />
                                                            <TextBlock Grid.Column="3" Text="{Binding ArkleSelection.OpeningPrice}" Margin="2" Width="Auto" Foreground="DarkGray" HorizontalAlignment="Right" />


                                                        </Grid>



                                                        <StackPanel  Visibility="{Binding ConverterParameter=TextRow, 
                                                            Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">
                                                            <Label Content="{Binding Text}" />
                                                        </StackPanel>

                                                        <Grid Visibility="{Binding ConverterParameter=ArkleSelectionResult, 
                                                            Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">

                                                            <Grid.ColumnDefinitions>
                                                                <ColumnDefinition Width="Auto"/>
                                                                <ColumnDefinition Width="88"/>
                                                                <ColumnDefinition Width="35"/>
                                                                <ColumnDefinition Width="38"/>
                                                            </Grid.ColumnDefinitions>
                                                            <!--<TextBlock Text="{Binding RowIndex}" Margin="2" Width="Auto" Height="Auto" />-->
                                                            <TextBlock Grid.Column="0" Text="{Binding ArkleSelection.SelectionNumber,StringFormat={}{0:00}}" Margin="2" Width="15" />
                                                            <TextBlock Grid.Column="1" Text="{Binding ArkleSelection.Name}" Margin="2" Width="100" />
                                                            <TextBlock Grid.Column="2" Text="{Binding ArkleSelection.PriceCurrent}" Margin="2" Width="Auto" HorizontalAlignment="Right" />
                                                            <TextBlock Grid.Column="3" Text="{Binding ArkleSelection.FinishingPosition,Converter={StaticResource ArkleSelectionFinishPositionToOrdinalDisplayText}}" Margin="2" Width="Auto"  HorizontalAlignment="Right" />


                                                        </Grid>

                                                        <StackPanel Visibility="{Binding ConverterParameter=ArkleSelectionNonRunner, Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}">
                                                            <StackPanel Orientation="Horizontal">
                                                                <!--<TextBlock Text="{Binding RowIndex}" Margin="2" Width="Auto" Height="Auto" />-->
                                                                <TextBlock Text="{Binding ArkleSelection.SelectionNumber,StringFormat={}{0:00}}" Margin="2" Width="15" />
                                                                <TextBlock Text="{Binding ArkleSelection.Name}" Margin="2" Width="100" Foreground="DarkGray"  />
                                                                <TextBlock Text="NR" Margin="2" Width="30" Foreground="DarkGray"  />
                                                                <TextBlock Text="{Binding ArkleSelection.OpeningPrice}" Margin="2" Width="30" Foreground="DarkGray" />

                                                            </StackPanel>

                                                        </StackPanel>

                                                    </Grid>


                                                </DataTemplate>
                                            </ListBox.ItemTemplate>
                                        </ListBox>


                                    </Grid>


                                </DataTemplate>
                            </ListBox.ItemTemplate>

                        </ListBox>



                    </Viewbox>



                </StackPanel>
            </StackPanel>

        </StackPanel>
    </Viewbox>


</Grid>

【问题讨论】:

  • 能否提供受问题影响的控件的代码?倾倒所有东西不是很有帮助。
  • @Mike,我无法用更小的 XAML 重现这个,你能告诉我你想删掉的部分吗?我不确定是问题所在的列表框还是代码中的其他内容,例如堆叠面板或什么。
  • 最好的事情是从内而外开始。从您的项目开始,沿着元素树向上移动,并仔细检查容器是否与顶部对齐。
  • 我相信你可以用更小的 XAML 重现这个。如果你想要一个具体的答案,你应该这样做。也就是说,从我在屏幕截图上看到的一点点来看,您在各个列中的元素似乎是垂直居中的。这表明您在某处将“顶部”对齐应用到了错误的元素。我怀疑你会找到愿意花时间理解你所包含的大量 XAML 的人,所以如果你想要一个有针对性的、具体的答案,你应该改进这个例子。
  • @Peter,我试过在上面到处设置顶部,但没有任何乐趣?

标签: c# wpf xaml


【解决方案1】:

添加到父列表框VerticalContentAlignment="Top"

编辑:
小演示,对源代码的改动很小:

<Viewbox Grid.ColumnSpan="2" VerticalAlignment="Top">
    <StackPanel   VerticalAlignment="Top">
        <StackPanel Orientation="Vertical " VerticalAlignment="Top">
            <StackPanel Height="338" >
                <Viewbox  VerticalAlignment="Top"  Stretch="Uniform">
                    <ListBox VerticalContentAlignment="Top"  Height="Auto" Width="Auto">
                        <ListBox.ItemsPanel>
                            <ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" VerticalAlignment="Top"/>
                            </ItemsPanelTemplate>
                        </ListBox.ItemsPanel>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid VerticalAlignment="Top">
                                    <ListBox  Height="Auto"    Margin="5" Width="Auto" HorizontalAlignment="Stretch">
                                        <ListBox.ItemTemplate>
                                            <DataTemplate>
                                                <TextBlock Width="40" Height="40">Some Child</TextBlock>
                                            </DataTemplate>
                                        </ListBox.ItemTemplate>
                                        <ListBox.Items>
                                            <TextBlock />
                                            <TextBlock />
                                            <TextBlock />
                                        </ListBox.Items>
                                    </ListBox>
                                </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <ListBox.Items>
                            <ListBoxItem>
                                <TextBlock />
                                <ListBoxItem.Style>
                                    <Style TargetType="ListBoxItem" >
                                        <Setter Property="Template" >
                                            <Setter.Value>
                                                <ControlTemplate>
                                                    <Border Margin="5" Background="Red" Height="150" Width="40" >
                                                        <TextBlock >Demo tol item</TextBlock>
                                                    </Border>
                                                </ControlTemplate>
                                            </Setter.Value>
                                        </Setter>
                                    </Style>
                                </ListBoxItem.Style>
                            </ListBoxItem>
                            <TextBlock />
                            <TextBlock />
                            <TextBlock />
                        </ListBox.Items>
                    </ListBox>
                </Viewbox>
            </StackPanel>
        </StackPanel>
    </StackPanel>
</Viewbox>

【讨论】:

  • @DermFrench 检查我的演示。您可以将ListBox.Items 部分替换为您的ItemSource(父列表框和子列表框)。对我来说它的工作。
【解决方案2】:

我没有足够的声誉将此作为评论发布,所以我将发布作为答案。

我相信您的问题可能出在您的 ListBox.ItemTemplate 中:

                      ...
                      <ListBox.ItemTemplate>
                            <DataTemplate>

                                <Grid VerticalAlignment="Top">
                                    <ListBox  Height="Auto" 
                                ItemsSource="{Binding .BoardMarkerRows}" Margin="5" Width="Auto" HorizontalAlignment="Stretch">

                                        <ListBox.ItemTemplate>
                                            <DataTemplate>

                                                <Grid > // Missing vertical allignment in this grid


                                                    <Grid Height="Auto" Background="LightGreen" Width="180"  Visibility="{Binding ConverterParameter=ArkleEvent 
                                                , Converter={StaticResource BoardMarketRowTypeToVisibilityConverter}}" VerticalAlignment="Top" >
                                                        <Grid.ColumnDefinitions>
                                                            <ColumnDefinition Width="75"/>
                                                            <ColumnDefinition Width="*"/>
                                                        </Grid.ColumnDefinitions>

                                                        <!--<TextBlock Text="{Binding RowType}" />-->
                                                        <TextBlock Text="{Binding ArkleEvent.Name}" Margin="2" Width="Auto" Height="Auto" FontWeight="Bold" />
                                                        <TextBlock Grid.Column="1" HorizontalAlignment="Right" Text="{Binding ArkleEvent.Going}" Margin="2" Width="Auto" Height="Auto" />
                                                    </Grid>
                                                    ...

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2013-02-01
    • 1970-01-01
    • 2017-12-17
    • 2015-09-15
    • 1970-01-01
    • 2016-10-08
    • 2014-08-02
    • 1970-01-01
    相关资源
    最近更新 更多