调整父窗口大小时自动调整用户控件的大小

时间:2013-11-17 15:37:04

标签: c# wpf window-resize

我正在开发一个C#WPF项目,我正在使用用户控件,但是我在调​​整父窗口大小时调整大小时遇到​​了问题。

我有一个名为MainWindow的窗口,其中包含一个托管用户控件的画布。调整主窗口大小时,用户控件也应调整大小。这是一个较少工作,除了它似乎没有填满谁的屏幕。下面是解释我的意思的代码和截图。

主窗口

以下是主窗口的代码,此窗口将托管用户控件

<Window x:Class="ReportReader.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="513" Width="925" WindowStartupLocation="CenterScreen">
    <Grid>
        <Menu Height="23" Name="menu1" VerticalAlignment="Top">
            <MenuItem Name="mnuFile" Header="File">
                <MenuItem Name="mnuOpen" Click="mnuOpen_Click" Header="Open" />
                <MenuItem Name="mnuClose" Click="mnuClose_Click" Header="Close Report" />
                <MenuItem Name="mnuRecentFile" Header="Recent Files" />
                <Separator />
                <MenuItem Name="mnuExit" Click="mnuExit_Click" Header="Exit" InputGestureText="Alt+F4" />
            </MenuItem>
        </Menu>
        <StatusBar Name="statusBar1" Height="28" VerticalAlignment="Bottom" />
        <Label Content="No Report Loaded" Name="lblStatus" Height="28" VerticalAlignment="Bottom" Margin="0,0,39,0" />
        <Grid Margin="12,29,12,34" Name="MainWindowHostCanvas" Background="Blue" />
    </Grid>
</Window>

画布为蓝色,因此它在屏幕截图中显示了我的问题。

以下是其中一个用户控件的代码

<UserControl x:Class="ReportReader.UserControls.ReportViewer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" mc:Ignorable="d" d:DesignWidth="879">
    <Grid Height="415">
        <Label Content="Report for..." Margin="12,12,12,0" Name="lblReportDateTitle" FontSize="26" FontWeight="Bold" HorizontalContentAlignment="Center" Height="44" VerticalAlignment="Top" />
        <ComboBox Height="23" HorizontalAlignment="Left" Margin="12,62,0,0" Name="cboRegisteredApps" VerticalAlignment="Top" Width="202" SelectionChanged="cboRegisteredApps_SelectionChanged">
            <ComboBoxItem Content="Select App" IsSelected="True" />
        </ComboBox>
        <DataGrid AutoGenerateColumns="False" Margin="14,203,12,12" Name="dataExceptionGroups" />
    </Grid>
</UserControl>

下面是程序首次加载时主窗口托管的用户控件的屏幕截图。

Screenshot from when application first loaded 如您所见,蓝色画布将整个窗口填充到状态栏,数据网格位于窗口底部,位于状态栏上方,报表标题位于窗口顶部的菜单上方酒吧。

以下是窗口已调整大小的屏幕截图

Screenshot of window after it has been resized 正如您在此屏幕截图中看到的那样,窗口已调整大小并且蓝色画布已调整大小以填充额外空间,但是,数据网格不再位于窗口底部,位于状态栏上方而是围绕中间。顶部的标题不再仅仅位于菜单栏下方,而且位于中间。

我不知道我能做些什么来解决这个问题。

感谢您提供的任何帮助。

3 个答案:

答案 0 :(得分:1)

如果设置了Height =“*”,那么所有行将平等地共享可用空间。如果你想设置%,那么你可以设置这样的东西

<Grid.RowDefenitions>
      <RowDefenition Height="10*"/>
      <RowDefenition Height="20*"/>
      <RowDefenition Height="60*"/>
      <RowDefenition Height="10*"/>   
 </Grid.RowDefenitions>

现在,当窗口重新调整大小时,所有行都将共享相同的百分比

所有行中的高度值不一定总和为100.例如,如果您有三行,那么您也可以设置如下

<Grid.RowDefenitions>
      <RowDefenition Height="20*"/>
      <RowDefenition Height="30*"/>
      <RowDefenition Height="10*"/>  
 </Grid.RowDefenitions>

然后总窗口大小将在所有三行之间划分如下

第一行高度的

将是WindowSize * 20 /(20 + 30 + 10)
对于第二行高度将是WindowSize * 30 /(20 + 30 + 10)
对于第3行高度将是WindowSize * 10 /(20 + 30 + 10)

当重新调整窗口大小时,所有行大小都会相应地重新调整大小

答案 1 :(得分:1)

Grid中的UserControl已将Height设置为415,这就是为什么它不会延伸:

<UserControl>
    <Grid Height="415">

如果您正在使用设计器来创建界面,那么它倾向于将这些属性设置为固定值。

答案 2 :(得分:0)

您正在使用静态大小调整,边距和高度与硬编码值。

1)删除边距高度和宽度的所有硬编码值。

2)使用行/列定义拆分网格,相对高度使用*,FYI可以设置MinHeight    在RowDefenition上。

 <Grid>
     <Grid.RowDefenitions>
          <RowDefenition Height="*"/>
          <RowDefenition Height="*"/>
          <RowDefenition Height="*"/>
          <RowDefenition Height="*"/>   
     </Grid.RowDefenitions>

     <Menu>
        .....
    </Menu>
    <StatusBar Grid.Row="1"/>
    <Label Content="No Report Loaded"  Grid.Row="2"  />
    <Grid Grid.Row="3" />
</Grid>

对UserControl执行相同的操作。