【问题标题】:How to make controls resize in WPF equivalently to Windows Form's anchor/dock properties?如何使 WPF 中的控件调整大小等同于 Windows 窗体的锚/停靠属性?
【发布时间】:2011-08-22 19:13:00
【问题描述】:

我已经阅读了很多解决此问题的方法。他们每个人都无法解决我的问题。无论我将控件放入哪个容器或在控件/容器上设置什么属性,它都不会让步。 我有一个带有控件的滚动查看器。当用户在运行时调整它的大小时,我希望它与窗口一起调整大小。我只需要anchor=top, bottom, left, right。我不明白为什么这在 WPF 中如此难以捉摸,以及为什么需要涉及容器对象和各种属性分配来完成单个属性在 Windows 窗体中的作用。但是这个问题的每个解决方案仍然会导致我的控件保持在其设计时大小,因为窗口在运行时调整大小。在 WPF 中掌握动态控件大小的简单方法是什么?

【问题讨论】:

  • 您能告诉我们您现在拥有的 XAML 代码吗?
  • 您可以尝试 width/height = "*" 和/或使用 stackpanel

标签: wpf autoresize


【解决方案1】:

控件需要拉伸,这就是它的全部内容:

<MyControl HorizontalAlignment="Stretch" VerticalAlignment="Stretch"/>

Stretch 替换了在两边设置锚点。

有关面板的帮助,请参阅this overview。另请参阅documentation of the layout system

大多数控件会自动拉伸,如果您有 DataGrid,它也应该拉伸,此示例包含一个 DataGrid 和一个显示其大小的 TextBlock:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition />
            <RowDefinition Height="Auto"/>
        </Grid.RowDefinitions>
        <DataGrid Name="grid">
            <DataGrid.Columns>
                <DataGridTextColumn Binding="{Binding Name}" Header="Name"/>
                <DataGridTextColumn Binding="{Binding Tag}" Header="Occupation"/>
            </DataGrid.Columns>
            <FrameworkElement Name="Skeet" Tag="Programmer"/>
            <FrameworkElement Name="Gravell" Tag="Programmer"/>
            <FrameworkElement Name="Steve" Tag="Coffee Getter"/>
        </DataGrid>
        <TextBlock Grid.Row="1">
            <TextBlock.Text>
                <MultiBinding StringFormat="{}{0}, {1}">
                    <Binding ElementName="grid" Path="ActualWidth"/>
                    <Binding ElementName="grid" Path="ActualHeight"/>
                </MultiBinding>
            </TextBlock.Text>
        </TextBlock>
    </Grid>
</Window>

如果将窗口缩小,DataGrid 的 ScrollBars 应该会出现。

【讨论】:

  • 我已经尝试了所有对齐设置的组合。每次控件都严格保持在其设计时维度。一定有其他东西阻止它调整大小,我只是看不到什么。
  • 控件所在的面板必须提供边界,否则它将无法拉伸,滚动查看器不会这样做,因为它的全部目的是可以查看任何大小的控件,它们通常不限制其内容。编辑:实际上它在某些情况下也适用于 ScrollViewer,这取决于控件。你到底用的是什么控件?
  • 它是一个数据网格。我正在尝试使滚动查看器调整为窗口大小(或窗口的可用大小,上面还有其他控件,但这是需要变大的控件)但是如果数据网格仍然太大我希望滚动查看器提供一种获取越界内容的方法。
  • DataGrid 有自己的 ScrollViewer。
【解决方案2】:

我假设不调整大小的控件是您的自定义控件。

  • 将 DockPanel 用作容器。
  • 从您的控件中移除显式的 Width 和 Height 属性。

如果您在 VS2008 中工作,那么这会带来不便,因为您的控件在设计器中查看时会折叠到最小尺寸。

Expressions Blend 和从 VS2010 开始都尊重设计器命名空间,因此您可以指定仅设计时控件大小。

为此,将以下内容添加到您的控件中:

<UserControl ...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    mc:Ignorable="d"
    d:DesignWidth="WWW" d:DesignHeight="HHH">
    ....
</UserControl>

d:DesignWidth 和 d:DesignHeight 指定设计时的宽度和高度。

【讨论】:

  • 我试过把它放在一个停靠面板中。在我看来,控件将扩展以填充停靠面板,但无论窗口有多大,停靠面板本身都保持相同的大小。
  • 我不小心投了反对票。当时我什至没有意识到我已经做到了。我想撤消它,但除非编辑答案,否则它不会让我改变我的投票。
【解决方案3】:

这个问题很老,但是,自从我在这里找到我的问题后,我想我会放弃我的解决方案。下面的代码是用于具有两个选项卡的选项卡控件,每个选项卡都包含一个填充选项卡的控件。我删除了明确设置的宽度和高度,并将水平和垂直对齐设置为自动在我想要调整大小的所有控件上。选项卡控件延伸到主窗口。选项卡中的控件会拉伸以填充选项卡。信息来自这里的答案。我只是举了一个完整的例子。

希望这对某人有用。

        <TabControl HorizontalAlignment="Stretch" 
                Margin="91,0,0,0" Name="tabControl1"
                VerticalAlignment="Stretch" >
        <TabItem Header="DataGrid" Name="tabItem1">
            <Grid>
                <DataGrid AutoGenerateColumns="False" 
                          HorizontalAlignment="Stretch" 
                          Name="dgFTPLog"
                          VerticalAlignment="Stretch" 
                          Margin="6,6,0,0" />
            </Grid>
        </TabItem>
        <TabItem Header="Log" Name="tabItem2">
            <Grid>
                <TextBox 
                         HorizontalAlignment="Stretch" 
                         Margin="6,6,0,0" Name="txtLog"
                         VerticalAlignment="Stretch"
                         VerticalScrollBarVisibility="Auto" 
                         HorizontalScrollBarVisibility="Auto" 
                         TextChanged="txtLog_TextChanged" />
            </Grid>
        </TabItem>
    </TabControl>

【讨论】:

    【解决方案4】:

    这也让我很伤心,AlexK 帮助我看到了光明。诀窍是不要设置高度和宽度......将这些设置为AUTO 并使用MARGIN 设置大小。将HORIZONTALALIGNMENTVERTICALALIGNMENT 设置为STRETCH,然后锚功能就起作用了。

    【讨论】:

      【解决方案5】:

      我也遇到过这个问题。 并尝试绑定到父控件 ActualHeight 和 ActualWidth 属性,除非这仅在您通过代码而不是 XAML 执行时才有效。

      即 XAML

      <MyParentControl x:name="parentControl" SizeChanged="parentControl_SizeChanged">
           <ChildControl x:name=childControl" />
      </MyParentControl>
      

      .cs 代码后面

      private void parentControl_SizeChanged(object sender, SizeChangedEventArgs e)
          {
              childControl.Height = parentControl.ActualHeight;
              childControl.Width = parentControl.ActualWidth;
          }
      

      【讨论】:

        猜你喜欢
        • 2013-04-30
        • 1970-01-01
        • 1970-01-01
        • 2011-03-30
        • 1970-01-01
        • 1970-01-01
        • 2012-05-17
        • 2013-08-25
        • 1970-01-01
        相关资源
        最近更新 更多