【问题标题】:WPF - Maximizing app window does not expand controls vertically - horizontally it doesWPF - 最大化应用程序窗口不会垂直扩展控件 - 它会水平扩展
【发布时间】:2010-09-27 13:43:58
【问题描述】:

当我按下我的 WPF 应用程序上的最大化按钮时,其中的所有控件都完美地水平扩展,但它们不会扩展以垂直填充窗口。我认为它最大化水平处理它,它也应该垂直处理它。我应该在每个控件的某处设置一个属性吗?我可以捕捉到 Resize 事件,但是要通过所有控件并仅垂直调整它们的大小似乎需要做很多工作。

感谢您的帮助。

【问题讨论】:

    标签: wpf controls


    【解决方案1】:

    为什么不只使用嵌套网格

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition Height="33"></RowDefinition>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="120"></ColumnDefinition>            
            <ColumnDefinition Width="200"></ColumnDefinition>
            <ColumnDefinition Width="3"></ColumnDefinition>
            <ColumnDefinition Width="*"></ColumnDefinition>
        </Grid.ColumnDefinitions>        
        <GridSplitter Grid.Column="2" Grid.Row="0" 
            Height="Auto" Width="Auto" HorizontalAlignment="Stretch" 
            VerticalAlignment="Stretch" />
    
        <Grid Grid.Column="0" Margin="4,10,2,0" Grid.Row="0" VerticalAlignment="Stretch">
            <Grid.RowDefinitions>
                <RowDefinition Height="20"></RowDefinition>
                <RowDefinition Height="*"></RowDefinition>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"></ColumnDefinition>
            </Grid.ColumnDefinitions>
    
            <TextBlock Grid.Column="0" Grid.Row="0" Style="{StaticResource HeaderText}" FontSize="13" >Templates</TextBlock>
    
            <ListBox Grid.Column="0" Grid.Row="1" FontSize="13" >
                <ListBoxItem>
                    Blank
                </ListBoxItem>
                <ListBoxItem>
                    New from existing...
                </ListBoxItem>
            </ListBox>
    
        </Grid>
    
        <ListView Grid.Column="1" Style="{StaticResource MyView}" Grid.Row="0" Margin="2,10,2,0">
            <ListViewItem>item1</ListViewItem>
        </ListView>
    
        <ListView Grid.Column="3" Style="{StaticResource MyView}" Grid.Row="0" Margin="2,10,4,0">
            <ListViewItem>item1</ListViewItem>
        </ListView>
    
        <WrapPanel Grid.Row="1" Grid.Column="3" HorizontalAlignment="Right">
            <Button Height="22" Width="60">Create</Button>
            <Button Height="22" Width="60">Cancel</Button>
        </WrapPanel>
    
    </Grid>    
    

    【讨论】:

      【解决方案2】:

      预览窗口会截断一些 XAML,但会显示在答案文本框中确定。让我知道它是否正常。 VerticalAlignment="Stretch" 没有帮助。

      <Window x:Class="MainScreen.Window1"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          xmlns:local="clr-namespace:MainScreen"
          xmlns:r="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
          xmlns:dg="http://schemas.microsoft.com/wpf/2008/toolkit" 
          WindowStartupLocation="CenterScreen"
          Title="Nodes" Height="600" Width="800"
          >
          <!-- The "toolkit" namespace above is for the data grid control.  It's reference is WPFToolkit. -->
          <Window.CommandBindings>
              <CommandBinding Command="{StaticResource LineTopologyCommand}" Executed="OnLineTopology" />
              <CommandBinding Command="{StaticResource PointToPointTopologyCommand}" Executed="OnPointToPointTopology" />
              <CommandBinding Command="{StaticResource PointToMultiPointTopologyCommand}" Executed="OnPointToMultiPointTopology" />
              <CommandBinding Command="{StaticResource MultiToMultiTopologyCommand}" Executed="OnMultiToMultiTopology" />
              <CommandBinding Command="{StaticResource CesTopologyCommand}" Executed="OnCESTopology" />
              <CommandBinding Command="{StaticResource AllTopologyCommand}" Executed="OnAllTopology" />
          </Window.CommandBindings>
          <StackPanel VerticalAlignment="Stretch">
              <r:Ribbon Name="mRibbon" DockPanel.Dock="Top">
                  <r:Ribbon.Resources>
                      <r:RibbonGroupSizeDefinitionCollection x:Key="ViewLayout">
                          <r:RibbonGroupSizeDefinition>
                              <!-- Control sizes: L,L,L -->
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                              <r:RibbonControlSizeDefinition ImageSize="Small" IsLabelVisible="True"/>
                          </r:RibbonGroupSizeDefinition>
                      </r:RibbonGroupSizeDefinitionCollection>
                  </r:Ribbon.Resources>
                  <r:Ribbon.ApplicationMenu>
                      <r:RibbonApplicationMenu>
                          <r:RibbonApplicationMenu.Command>
                              <r:RibbonCommand
                                  Executed="OnCloseApplication"
                                  LabelDescription="Application Button"
                                  SmallImageSource="Images/SEL.ico"
                                  LargeImageSource="Images/SEL.ico"
                                  ToolTipTitle="SEL Network Management System"
                                  ToolTipDescription="" />
                          </r:RibbonApplicationMenu.Command>
                      </r:RibbonApplicationMenu>
                  </r:Ribbon.ApplicationMenu>
                  <r:Ribbon.QuickAccessToolBar>
                      <r:RibbonQuickAccessToolBar CanUserCustomize="True">
                      </r:RibbonQuickAccessToolBar>
                  </r:Ribbon.QuickAccessToolBar>
                  <r:RibbonTab Label="View" MouseLeftButtonUp="RibbonTab_View_MouseLeftButtonUp">
                      <r:RibbonTab.Groups>
                          <r:RibbonGroup GroupSizeDefinitions="{StaticResource ViewLayout}">
                              <r:RibbonGroup.Command>
                                  <r:RibbonCommand LabelTitle="Topology"/>
                              </r:RibbonGroup.Command>
                              <r:RibbonButton Command="{StaticResource LineTopologyCommand}"/>
                              <r:RibbonButton Command="{StaticResource PointToPointTopologyCommand}" />
                              <r:RibbonButton Command="{StaticResource PointToMultiPointTopologyCommand }" />
                              <r:RibbonButton Command="{StaticResource MultiToMultiTopologyCommand }" />
                              <r:RibbonButton Command="{StaticResource CesTopologyCommand }" />
                              <r:RibbonButton Command="{StaticResource AllTopologyCommand }" />
                          </r:RibbonGroup>
                      </r:RibbonTab.Groups>
                  </r:RibbonTab>
                  <r:RibbonTab Label="Home" MouseLeftButtonUp="RibbonTab_Home_MouseLeftButtonUp">
      
                  </r:RibbonTab>
                  <r:RibbonTab Label="Device Designer">
      
                  </r:RibbonTab>
                  <r:RibbonTab Label="Network Design">
      
                  </r:RibbonTab>
              </r:Ribbon>
              <StackPanel DockPanel.Dock="Top" Orientation="Horizontal" HorizontalAlignment="Center">
                  <StackPanel.Resources>
                      <Style x:Name="ButtonStyle" TargetType="{x:Type Button}">
                          <Setter Property="Template">
                              <Setter.Value>
                                  <ControlTemplate TargetType="{x:Type Button}">
                                      <Border Name="theBorder" BorderBrush="Gray" BorderThickness="2" 
                                  CornerRadius="10" Padding="5" Background="{TemplateBinding Background}">
                                          <ContentPresenter/>
                                      </Border>
                                      <ControlTemplate.Triggers>
                                          <Trigger Property="IsMouseOver" Value="True">
                                              <Setter TargetName="theBorder" Property="BorderBrush" Value="#333333"/>
                                          </Trigger>
                                          <Trigger Property="IsPressed" Value="True">
                                              <Setter TargetName="theBorder" Property="Background" Value="#CCCCCC"/>
                                          </Trigger>
                                      </ControlTemplate.Triggers>
                                  </ControlTemplate>
                              </Setter.Value>
                          </Setter>
                      </Style>
                  </StackPanel.Resources>
                  <Label Content="Number of Nodes"/>
                  <TextBox x:Name="NumNodes"  HorizontalAlignment="Right" Margin="0,0,6.71,0" Width="30"/>
                  <Slider
                          x:Name="uiScaleSlider"
                          Width="78"
                          HorizontalAlignment="Left"
                          VerticalAlignment="Top"
                          ToolTip="Determines the UI scale factor."
                          Height="27"
                          Value=".1" Minimum=".5" Maximum="5"
                          Orientation="Horizontal"
                          Ticks="1"
                          IsSnapToTickEnabled="False"
                          TickFrequency="1"
                          TickPlacement="BottomRight"
                          AutoToolTipPlacement="BottomRight"
                          AutoToolTipPrecision="2" />
                  <Button Name="AddNodes" Content="Add Nodes" Margin="0,0,10,0"/>
                  <Button Name="Clear" Content="Clear" Margin="0,0,5,0"/>
              </StackPanel>
              <Grid VerticalAlignment="Stretch" x:Name="mainGrid" Margin="2,5,0,0" Height="390" Background="WhiteSmoke">
                  <Grid.ColumnDefinitions>
                      <ColumnDefinition Width="2*"/>
                      <ColumnDefinition Width="*"/>
                  </Grid.ColumnDefinitions>
                  <Grid.RowDefinitions>
                      <RowDefinition Height="3*"/>
                      <RowDefinition Height="*"/>
                  </Grid.RowDefinitions>
                  <GridSplitter Grid.Column="0" Grid.RowSpan="2" Width="5" ResizeDirection="Columns" Grid.ColumnSpan="1" Height="Auto" ResizeBehavior="BasedOnAlignment" VerticalAlignment="Stretch"/>
                  <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
                      <local:Graph x:Name="theGraphPanel" Background="#FFE7CEBF" Grid.Column="0" Grid.Row="0" Margin="2,2,2,2">
                          <local:Graph.LayoutTransform>
                              <ScaleTransform
                                          CenterX="0" CenterY="0"
                                          ScaleX="{Binding Path=Value, ElementName=uiScaleSlider}"
                                          ScaleY="{Binding Path=Value, ElementName=uiScaleSlider}"
                                      />
                          </local:Graph.LayoutTransform>
                      </local:Graph>
                  </ScrollViewer>
                  <TabControl x:Name="mTabControl"  Grid.Column="1" Grid.RowSpan="2" Margin="3,0,0,2">
                      <TabItem Name="Item1" Header="Circuit">
                          <TreeView>
                              <TreeViewItem Header="Ring1">
                                  <TreeViewItem Header="Site 1">
                                      <TreeViewItem Header="Node 1">
                                          Data (#113)
                                      </TreeViewItem>
                                      <TreeViewItem Header="Node 2">
                                          Data (#114)
                                      </TreeViewItem>
                                      <TreeViewItem Header="Node 3">
                                          Data (#115)
                                      </TreeViewItem>
                                  </TreeViewItem>
                                  <TreeViewItem Header="Site 2">
                                  </TreeViewItem>
                              </TreeViewItem>
                              <TreeViewItem Header="Ring 2">
                                  <TreeViewItem Header="Site 2">
                                      <TreeViewItem Header="Node 1">
                                          Data (#7)
                                      </TreeViewItem>
                                  </TreeViewItem>
                              </TreeViewItem>
                          </TreeView>
                      </TabItem>
                      <TabItem Name="Item2" Header="Inventory"></TabItem>
                  </TabControl>
                  <GridSplitter Grid.Row="1" ResizeDirection="Rows" ResizeBehavior="BasedOnAlignment" HorizontalAlignment="Stretch" Name="GridSplitter1" Height="5" VerticalAlignment="Top" />
              </Grid>
          </StackPanel>
      </Window>
      

      【讨论】:

        【解决方案3】:

        仅供参考。我最终将网格的高度更改为“自动”,然后当 Window1 的 SizeChanged 事件触发时,我将网格高度设置为 e.NewSize.Height 减去其上方 StackPanel 中控件的 ActualHeights .不是我想要的样子,但到目前为止我发现唯一可行的解​​决方案。

        谢谢。

        【讨论】:

          【解决方案4】:

          是的,当我调整窗口大小时,该控件不会垂直收缩/增长。

          自从我写了,我将网格高度更改为自动,当我运行我的应用程序时,网格,因为它是 StackPanel 中的最后一个控件,所以它只占用窗口中剩余空间的一部分首先显示 - 可能是 390 个中的 80 个。在第 0 行第 0 列中,我有一个自定义面板 (theGraphPanel),我在其中绘制一个圆圈中的节点。如果我画了 20 个节点,则该单元格的大小适当,甚至在最大化时占据整个屏幕。这在一定程度上解决了问题,尽管垂直滚动不起作用,因为我相信它认为它具有无限的高度。

          我希望网格以我将大小设置为 390 时的方式显示在屏幕上 - 第一行占据剩余空间高度的 3*,第二行占据 * 高度。我想我想做的是模拟 MDI 设置。当我第一次启动应用程序 (800 x 600) 时,我希望比例保持不变,然后当我最大化它时。据我所知,除非网格单元有内容,否则当整体网格高度设置为“自动”时,它们将保持最小大小并增长到内容的大小。也许我正在尝试做一些不可能的事情。

          感谢到目前为止的回答。

          【讨论】:

            【解决方案5】:

            当您调整窗口大小时,相关控件是否会垂直缩小/增长?

            您将 Grid 的 Height 属性设置为“390”,这使它垂直固定大小。如果这是您对其他所有内容的“父”控件,他们将以此为关键。

            【讨论】:

              【解决方案6】:

              你能给我们看一些 Xaml 吗?尝试将外部容器设置为 VerticalAlignment="Stretch"

              【讨论】:

                猜你喜欢
                • 2010-11-19
                • 1970-01-01
                • 2011-05-30
                • 2017-12-18
                • 1970-01-01
                • 2013-12-28
                • 2012-04-05
                • 2016-01-16
                • 1970-01-01
                相关资源
                最近更新 更多