30

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

4

5 回答 5

47

这也让我感到悲伤,而 AlexK 帮助我看到了光明。诀窍是不要设置高度和宽度...。将它们设置为AUTO并使用MARGIN设置大小。将HORIZONTALALIGNMENTand设置VERTICALALIGNMENTSTRETCH然后锚功能起作用。

于 2011-10-09T05:22:41.460 回答
5

控件需要伸展,这就是它应该有的一切:

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

Stretch替换在两侧设置锚点。

有关面板的帮助,请参阅此概述。另请参阅布局系统的文档

大多数控件会自动拉伸,如果您有 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 应该会出现。

于 2011-05-10T20:36:57.790 回答
4

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

  • 使用 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 指定设计时的宽度和高度。

于 2011-05-10T20:44:08.540 回答
1

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

希望这对某人有用。

        <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>
于 2011-09-21T19:34:56.350 回答
-1

我也遇到过这个问题。并尝试绑定到父控件 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;
    }
于 2016-02-11T18:21:22.050 回答