【问题标题】:AvalonDock: How to auto-resize the control?AvalonDock:如何自动调整控件大小?
【发布时间】:2019-07-05 15:17:48
【问题描述】:

我似乎无法在调整主窗口大小时自动调整 AvalonDock 控件的大小。 (此外,控件应该在启动时停靠到整个窗口,这也让我感到困惑。)

我已经尝试了HorizontalAlignmentVerticalAlignment 属性,正如here 和SO 上的其他几个地方所建议的那样,但它们不适用于此控件。调整窗口大小时不会发生控件大小调整。

从它的声音来看,这些属性控制着为它的 child 控件调整控件的大小。但是,我需要用它的 parent(窗口)调整控件的大小。

这是我的 XAML,从 Xceed 示例复制并稍作修改以在我的环境中运行:

<Window 
  x:Class="Docker"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
  xmlns:xcad="http://schemas.xceed.com/wpf/xaml/avalondock"
  xmlns:s="clr-namespace:System;assembly=mscorlib"
  Title="AvalonDock">

  <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <TextBlock Grid.Row="0"
               Text="Usage:"
               Style="{StaticResource Header}" />

    <StackPanel Grid.Row="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
      <xcad:DockingManager x:Name="_dockingManager"
                           HorizontalAlignment="Stretch"
                           VerticalAlignment="Stretch"
                           AllowMixedOrientation="True"
                           BorderBrush="Gray"
                           BorderThickness="1">
        <xcad:DockingManager.DocumentHeaderTemplate>
          <DataTemplate>
            <StackPanel Orientation="Horizontal">
              <Image Source="{Binding IconSource}"
                     Margin="0,0,4,0" />
              <TextBlock Text="{Binding Title}" />
            </StackPanel>
          </DataTemplate>
        </xcad:DockingManager.DocumentHeaderTemplate>
        <xcad:LayoutRoot x:Name="_layoutRoot">
          <xcad:LayoutPanel Orientation="Horizontal">
            <xcad:LayoutAnchorablePane DockWidth="200">
              <xcad:LayoutAnchorable ContentId="properties"
                                     Title="Properties"
                                     CanHide="False"
                                     CanClose="False"
                                     AutoHideWidth="240"
                                     IconSource="..\Images\table-gear.png">
                <xctk:PropertyGrid NameColumnWidth="110"
                                   SelectedObject="{Binding ElementName=_layoutRoot, Path=LastFocusedDocument.Content}"
                                   AutoGenerateProperties="False">
                  <xctk:PropertyGrid.PropertyDefinitions>
                    <xctk:PropertyDefinition TargetProperties="Background" />
                    <xctk:PropertyDefinition TargetProperties="BorderBrush" />
                    <xctk:PropertyDefinition TargetProperties="BorderThickness" />
                    <xctk:PropertyDefinition TargetProperties="FontSize" />
                    <xctk:PropertyDefinition TargetProperties="FontStyle" />
                    <xctk:PropertyDefinition TargetProperties="Width" />
                    <xctk:PropertyDefinition TargetProperties="Height" />
                  </xctk:PropertyGrid.PropertyDefinitions>
                </xctk:PropertyGrid>
              </xcad:LayoutAnchorable>
            </xcad:LayoutAnchorablePane>
            <xcad:LayoutDocumentPaneGroup>
              <xcad:LayoutDocumentPane>
                <xcad:LayoutDocument ContentId="document1"
                                     Title="Document 1"
                                     IconSource="..\Images\document.png">
                  <Button Content="Document 1 Content"
                          HorizontalAlignment="Center"
                          VerticalAlignment="Center" />
                </xcad:LayoutDocument>
                <xcad:LayoutDocument ContentId="document2"
                                     Title="Document 2"
                                     IconSource="..\Images\document.png">
                  <TextBox Text="Document 2 Content"
                           AcceptsReturn="True" />
                </xcad:LayoutDocument>
              </xcad:LayoutDocumentPane>
            </xcad:LayoutDocumentPaneGroup >
            <xcad:LayoutAnchorablePaneGroup DockWidth="125">
              <xcad:LayoutAnchorablePane>
                <xcad:LayoutAnchorable ContentId="alarms"
                                       Title="Alarms"
                                       IconSource="..\Images\alarm.png"
                                       CanClose="True">
                  <ListBox>
                    <s:String>Alarm 1</s:String>
                    <s:String>Alarm 2</s:String>
                    <s:String>Alarm 3</s:String>
                  </ListBox>
                </xcad:LayoutAnchorable>
                <xcad:LayoutAnchorable ContentId="journal"
                                       Title="Journal">
                  <RichTextBox>
                    <FlowDocument>
                      <Paragraph FontSize="14"
                                 FontFamily="Segoe">
                        This is the content of the Journal Pane.
                        <LineBreak />
                        A
                        <Bold>RichTextBox</Bold> has been added here
                      </Paragraph>
                    </FlowDocument>
                  </RichTextBox>
                </xcad:LayoutAnchorable>
              </xcad:LayoutAnchorablePane>
            </xcad:LayoutAnchorablePaneGroup>
          </xcad:LayoutPanel>

          <xcad:LayoutRoot.LeftSide>
            <xcad:LayoutAnchorSide>
              <xcad:LayoutAnchorGroup>
                <xcad:LayoutAnchorable Title="Agenda"
                                       ContentId="agenda"
                                       IconSource="..\Images\book_open.png">
                  <TextBlock Text="Agenda Content"
                             Margin="10"
                             FontSize="18"
                             FontWeight="Black"
                             TextWrapping="Wrap" />
                </xcad:LayoutAnchorable>
                <xcad:LayoutAnchorable Title="Contacts"
                                       ContentId="contacts"
                                       IconSource="..\Images\address_book-edit.png">
                  <TextBlock Text="Contacts Content"
                             Margin="10"
                             FontSize="18"
                             FontWeight="Black"
                             TextWrapping="Wrap" />
                </xcad:LayoutAnchorable>
              </xcad:LayoutAnchorGroup>
            </xcad:LayoutAnchorSide>
          </xcad:LayoutRoot.LeftSide>
        </xcad:LayoutRoot>
      </xcad:DockingManager>

      <StackPanel Orientation="Horizontal"
                  HorizontalAlignment="Center">
        <Button Content="Save AvalonDock"
                Margin="5"
                Padding="5"
                Click="SaveButton_Click" />
        <Button Content="Load AvalonDock"
                Margin="5"
                Padding="5"
                Click="LoadButton_Click" />
      </StackPanel>
    </StackPanel>
  </Grid>
</Window>

【问题讨论】:

    标签: wpf autoresize


    【解决方案1】:

    去掉Grid第二行的StackPanelStackPanel 不会调整其子项的大小。

    还要注意HorizontalAlignmentGridVerticalAlignment 的默认值都是Stretch,因此您无需显式设置这些值。

    试试这个:

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
            <RowDefinition Height="Auto" />
        </Grid.RowDefinitions>
    
        <TextBlock Grid.Row="0" Text="Usage:" Style="{StaticResource Header}" />
    
        <xcad:DockingManager x:Name="_dockingManager"
                               HorizontalAlignment="Stretch"
                               VerticalAlignment="Stretch"
                               AllowMixedOrientation="True"
                               Grid.Row="1"
                               BorderBrush="Gray"
                               BorderThickness="1">
            <xcad:DockingManager.DocumentHeaderTemplate>
                <DataTemplate>
                    <StackPanel Orientation="Horizontal">
                        <Image Source="{Binding IconSource}"
                         Margin="0,0,4,0" />
                        <TextBlock Text="{Binding Title}" />
                    </StackPanel>
                </DataTemplate>
            </xcad:DockingManager.DocumentHeaderTemplate>
            <xcad:LayoutRoot x:Name="_layoutRoot">
                <xcad:LayoutPanel Orientation="Horizontal">
                    <xcad:LayoutAnchorablePane DockWidth="200">
                        <xcad:LayoutAnchorable ContentId="properties"
                                         Title="Properties"
                                         CanHide="False"
                                         CanClose="False"
                                         AutoHideWidth="240"
                                         IconSource="..\Images\table-gear.png">
                            <xctk:PropertyGrid NameColumnWidth="110"
                                       SelectedObject="{Binding ElementName=_layoutRoot, Path=LastFocusedDocument.Content}"
                                       AutoGenerateProperties="False">
                                <xctk:PropertyGrid.PropertyDefinitions>
                                    <xctk:PropertyDefinition TargetProperties="Background" />
                                    <xctk:PropertyDefinition TargetProperties="BorderBrush" />
                                    <xctk:PropertyDefinition TargetProperties="BorderThickness" />
                                    <xctk:PropertyDefinition TargetProperties="FontSize" />
                                    <xctk:PropertyDefinition TargetProperties="FontStyle" />
                                    <xctk:PropertyDefinition TargetProperties="Width" />
                                    <xctk:PropertyDefinition TargetProperties="Height" />
                                </xctk:PropertyGrid.PropertyDefinitions>
                            </xctk:PropertyGrid>
                        </xcad:LayoutAnchorable>
                    </xcad:LayoutAnchorablePane>
                    <xcad:LayoutDocumentPaneGroup>
                        <xcad:LayoutDocumentPane>
                            <xcad:LayoutDocument ContentId="document1"
                                         Title="Document 1"
                                         IconSource="..\Images\document.png">
                                <Button Content="Document 1 Content"
                              HorizontalAlignment="Center"
                              VerticalAlignment="Center" />
                            </xcad:LayoutDocument>
                            <xcad:LayoutDocument ContentId="document2"
                                         Title="Document 2"
                                         IconSource="..\Images\document.png">
                                <TextBox Text="Document 2 Content"
                               AcceptsReturn="True" />
                            </xcad:LayoutDocument>
                        </xcad:LayoutDocumentPane>
                    </xcad:LayoutDocumentPaneGroup >
                    <xcad:LayoutAnchorablePaneGroup DockWidth="125">
                        <xcad:LayoutAnchorablePane>
                            <xcad:LayoutAnchorable ContentId="alarms"
                                           Title="Alarms"
                                           IconSource="..\Images\alarm.png"
                                           CanClose="True">
                                <ListBox>
                                    <s:String>Alarm 1</s:String>
                                    <s:String>Alarm 2</s:String>
                                    <s:String>Alarm 3</s:String>
                                </ListBox>
                            </xcad:LayoutAnchorable>
                            <xcad:LayoutAnchorable ContentId="journal"
                                           Title="Journal">
                                <RichTextBox>
                                    <FlowDocument>
                                        <Paragraph FontSize="14"
                                     FontFamily="Segoe">
                                            This is the content of the Journal Pane.
                                            <LineBreak />
                                            A
                                            <Bold>RichTextBox</Bold> has been added here
                                        </Paragraph>
                                    </FlowDocument>
                                </RichTextBox>
                            </xcad:LayoutAnchorable>
                        </xcad:LayoutAnchorablePane>
                    </xcad:LayoutAnchorablePaneGroup>
                </xcad:LayoutPanel>
    
                <xcad:LayoutRoot.LeftSide>
                    <xcad:LayoutAnchorSide>
                        <xcad:LayoutAnchorGroup>
                            <xcad:LayoutAnchorable Title="Agenda"
                                           ContentId="agenda"
                                           IconSource="..\Images\book_open.png">
                                <TextBlock Text="Agenda Content"
                                 Margin="10"
                                 FontSize="18"
                                 FontWeight="Black"
                                 TextWrapping="Wrap" />
                            </xcad:LayoutAnchorable>
                            <xcad:LayoutAnchorable Title="Contacts"
                                           ContentId="contacts"
                                           IconSource="..\Images\address_book-edit.png">
                                <TextBlock Text="Contacts Content"
                                 Margin="10"
                                 FontSize="18"
                                 FontWeight="Black"
                                 TextWrapping="Wrap" />
                            </xcad:LayoutAnchorable>
                        </xcad:LayoutAnchorGroup>
                    </xcad:LayoutAnchorSide>
                </xcad:LayoutRoot.LeftSide>
            </xcad:LayoutRoot>
        </xcad:DockingManager>
    
        <StackPanel Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center">
            <Button Content="Save AvalonDock"
                    Margin="5"
                    Padding="5"
                    Click="SaveButton_Click" />
            <Button Content="Load AvalonDock"
                    Margin="5"
                    Padding="5"
                    Click="LoadButton_Click" />
        </StackPanel>
    </Grid>
    

    【讨论】:

    • 我们越来越近了,谢谢。 Buttons 现在拥抱窗口底部,但 DockingManager 仍然没有。此外,DockingManager 现在移动到窗口顶部,与 Usage TextBlock 占据相同的空间。
    • 好的,现在可以了。我将DockingManager 放入Grid.Row="1"。这也解决了another problem,所以今天已经踏上了坚实的基础。
    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多