2015-03-10 2 views
2

У меня проблема с выравниванием панелей/сеток в стеке в моем окне WPF. Любые идеи о том, что я делаю неправильно? Похоже, что это происходит, когда я пытаюсь выровнять содержимое в списке, отображая элементы, используя горизонтальную выровненную стеквую панель.Верхнее выравнивание внутри WPF ListBox WPF XAML

Если я установил высоту сетки, которая содержит ListBox с ItemsSource = {Binding BoardMarkerRows}, чтобы сказать 1400, выравнивание затем начнет работать правильно (но я хочу, чтобы эта сетка имела автоматическую высоту).

Скриншот показывает выравнивание от: enter image description here

Вот мой 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> 

+2

могли бы вы предоставить код для управления, пострадавших от этой проблемы? Сбрасывать все не очень полезно. –

+0

@Mike, я не могу воспроизвести это с меньшим XAML, не могли бы вы показать мне раздел, который вы хотите вырезать. Я не уверен, что это список, с которым проблема связана или что-то еще в коде, например. стек панелей или что. – DermFrench

+0

Лучше всего начать с наизнанку. Начните с вашего элемента и проделайте путь вверх по дереву элементов и дважды проверьте, что контейнеры выровнены сверху. –

ответ

2

Добавить в родительском-ListBox VerticalContentAlignment="Top"

Edit:
Маленькая демо, с минимальными изменениями из источника:

<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> 
+0

@DermFrench Проверьте мою демонстрацию. вы можете заменить раздел «ListBox.Items» своим «ItemSource» (как родительским, так и дочерним ListBox's). для меня его работа. – dovid

1

Я не имею достаточно репутацию, чтобы отправить это как комментарий, так что я сообщение в качестве ответа.

Я считаю, что ваша проблема может быть в вашем 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> 
                ... 
Смежные вопросы