WPF格式问题 - 自动拉伸和调整大小?

时间:2010-05-17 21:55:31

标签: wpf xaml

我是WPF和XAML的新手。我正在尝试设计一个基本的数据输入表单。我已经使用了一个堆栈面板,它可以容纳四个堆栈面板来获得我想要的布局。也许网格会更好,我不确定。

以下是生成它的XAML代码:

<Window x:Class="Test1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="224" Width="536.762">
    <StackPanel Height="Auto" Name="stackPanel1" Width="Auto" Orientation="Horizontal">
        <StackPanel Height="Auto" Name="stackPanel2" Width="Auto">
            <Label Height="Auto" Name="label1" Width="Auto">Patient Name:</Label>
            <Label Height="Auto" Name="label2" Width="Auto">Physician:</Label>
            <Label Height="Auto" Name="label3" Width="Auto">Insurance:</Label>
            <Label Height="Auto" Name="label4" Width="Auto">Therapy Goals:</Label>
        </StackPanel>
        <StackPanel Height="Auto" Name="stackPanel3" Width="Auto">
            <TextBox Height="Auto" Name="textBox1" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox2" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox3" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox4" Width="Auto" Padding="3" Margin="1" />
        </StackPanel>
        <StackPanel Height="Auto" Name="stackPanel4" Width="Auto">
            <Label Height="Auto" Name="label5" Width="Auto">Date:</Label>
            <Label Height="Auto" Name="label6" Width="Auto">Patient Phone:</Label>
            <Label Height="Auto" Name="label7" Width="Auto">Facility:</Label>
            <Label Height="Auto" Name="label8" Width="Auto">Referring Physician:</Label>
        </StackPanel>
        <StackPanel Height="Auto" Name="stackPanel5" Width="Auto">
            <TextBox Height="Auto" Name="textBox5" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox6" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox7" Width="Auto" Padding="3" Margin="1" />
            <TextBox Height="Auto" Name="textBox8" Width="Auto" Padding="3" Margin="1" />
        </StackPanel>
    </StackPanel>
</Window>

我真正想要的是文本框平均拉伸以水平填充空间。我还希望每个垂直堆栈面板中的控件在窗口垂直调整大小时均匀地“展开”。

2 个答案:

答案 0 :(得分:3)

StackPanel始终根据其方向将其子项与顶部或左侧边缘对齐。这听起来像你想要的是外部StackPanel所在的UniformGrid。试试这个:

<Window>
    <UniformGrid Name="stackPanel1" Rows="1">
        <StackPanel Name="stackPanel2">
           ...
        </StackPanel>
        <StackPanel Name="stackPanel3">
           ...
        </StackPanel>
        <StackPanel Name="stackPanel4">
           ...
        </StackPanel>
        <StackPanel Name="stackPanel5">
           ...
        </StackPanel>
    </UniformGrid>
</Window>

请注意,您无需设置Width = Auto或Height = Auto,这是隐含的。

但你是对的,Grid可能更好(即使XAML很难看),因为在这种布局配置中,你的标签很容易与文本框不对齐。你也可以试试这样的东西......

<UniformGrid Rows="1">

    <Grid>

        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto" />
            <ColumnDefinition Width="*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="Auto" />
            <RowDefinition Height="*" />
        </Grid.RowDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="Field 1" />
        <TextBox Grid.Row="0" Grid.Column="1" />


        <Label Grid.Row="1" Grid.Column="0" Content="Field 2" />
        <TextBox Grid.Row="1" Grid.Column="1" />


        <Label Grid.Row="2" Grid.Column="0" Content="Field 3" />
        <TextBox Grid.Row="2" Grid.Column="1" />

    </Grid>

    <Grid /> <!-- repeat above -->

    <Grid /> <!-- etc... -->

</UniformGrid>

答案 1 :(得分:1)

取消Josh所说的内容,如果你需要控件垂直填充空间,你可以定义一些“空间填充”行来垂直展开控件。这里有一些XAML演示了这一点(我添加了边距以从窗口边框推出标签)。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
        <RowDefinition Height="*" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Label Grid.Column="0" Grid.Row="0" Margin="5">Patient Name:</Label>
    <TextBox Grid.Column="1" Grid.Row="0" Margin="5" />
    <Label Grid.Column="0" Grid.Row="2" Margin="5">Physician:</Label>
    <TextBox Grid.Column="1" Grid.Row="2" Margin="5" />
    <Label Grid.Column="0" Grid.Row="4" Margin="5">Insurance:</Label>
    <TextBox Grid.Column="1" Grid.Row="4" Margin="5" />
    <Label Grid.Column="0" Grid.Row="6" Margin="5">Therapy Goals:</Label>
    <TextBox Grid.Column="1" Grid.Row="6" Margin="5" />
    <Label Grid.Column="2" Grid.Row="0" Margin="5">Date:</Label>
    <TextBox Grid.Column="3" Grid.Row="0" Margin="5" />
    <Label Grid.Column="2" Grid.Row="2" Margin="5">Patient Phone:</Label>
    <TextBox Grid.Column="3" Grid.Row="2" Margin="5" />
    <Label Grid.Column="2" Grid.Row="4" Margin="5">Facility:</Label>
    <TextBox Grid.Column="3" Grid.Row="4" Margin="5" />
    <Label Grid.Column="2" Grid.Row="6" Margin="5">Referring Physician:</Label>
    <TextBox Grid.Column="3" Grid.Row="6" Margin="5" />
</Grid>