【发布时间】:2010-05-26 17:11:43
【问题描述】:
我有一个带有标签的窗口。在其中一个选项卡上,我的布局如下所示。 (其实比较复杂,我一行有4个文本框,而且行数更多。)怎样才能让第3个文本框有标签的宽度+上面文本框的宽度,也就是要它们是否正确对齐?问题是当我在其中输入文本时,WPF 会扩大第三个文本框。对大小使用硬编码数字违背了 WPF 的全部目的。在 Windows 窗体中我可以比在 WPF 中快 10 倍。
有没有更好的方法,而不是为每组连续的小文本框使用网格,不得不从网格中跳过大的文本框,因为把它们放在里面会搞砸一切。
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
</Style>
<Style x:Key="SmallTextBox" TargetType="{x:Type TextBox}"
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Width" Value="50"/>
</Style>
</Window.Resources>
<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"
Width="{Binding ElementName=grid,Path=ActualWidth}"
Grid.IsSharedSizeScope="True">
<Grid Name="grid" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="c1"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="c2"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Content="Foo:"/>
<TextBox Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
<Label Grid.Row="1" Content="Foobar:"/>
<TextBox Grid.Row="1" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
</Grid>
<TextBox Grid.Row="1"/>
<Grid Name="grid2" HorizontalAlignment="Left">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="c1"/>
<ColumnDefinition Width="Auto" SharedSizeGroup="c2"/>
</Grid.ColumnDefinitions>
<Label Content="Bar:"/>
<TextBox Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
</Grid>
</StackPanel>
</Window>
编辑:这是基于 Julien Lebosquain 回答的解决方案:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="VerticalAlignment" Value="Center"/>
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="VerticalAlignment" Value="Center"/>
<Setter Property="Margin" Value="3"/>
</Style>
<Style x:Key="SmallTextBox" TargetType="{x:Type TextBox}"
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Width" Value="50"/>
</Style>
</Window.Resources>
<StackPanel VerticalAlignment="Top" HorizontalAlignment="Left"
Width="{Binding ElementName=grid,Path=ActualWidth}">
<Grid Name="grid">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<Label Content="Foo:"/>
<TextBox Grid.Column="1" Style="{StaticResource SmallTextBox}"/>
<Label Grid.Row="1" Content="Foobar:"/>
<TextBox Grid.Row="1" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
<TextBox Grid.Row="2" Grid.ColumnSpan="2"/>
<Label Grid.Row="3" Content="Bar:"/>
<TextBox Grid.Row="3" Grid.Column="1"
Style="{StaticResource SmallTextBox}"/>
</Grid>
</StackPanel>
</Window>
【问题讨论】:
标签: wpf