你正在做的实际上是相当复杂的。
您实际上希望它左对齐。这很容易。将其设置为 HorizontalAlignment="Left"。
您需要最小尺寸和最大尺寸以及在调整窗口大小时在这些尺寸之间增长的能力。
首先,您需要 TextBox 在它和 Column 之间有一个父级,该父级将扩展到 Column 的整个宽度。
<Window x:Class="TestTextAlignment.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:TestTextAlignment"
Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded">
<Grid Name="MainGrid" ShowGridLines="True" Height="30" >
<Grid.Resources>
<loc:ColumnSizeToTextBoxSizeConverter x:Key="SizeConverter" LeftMargin="5" RightMargin="25"/>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Name="ColDef1" Width="*"></ColumnDefinition>
<ColumnDefinition Name="ColDef2" Width="*"></ColumnDefinition>
<ColumnDefinition Name="ColDef3" Width="*"></ColumnDefinition>
</Grid.ColumnDefinitions>
<DockPanel Name="Col1">
<TextBox Text="Text 1" Margin="5" HorizontalAlignment="Left" MinWidth="100" MaxWidth="300"
Width="{Binding ElementName=Col1, Path=ActualWidth, Mode=OneWay, Converter={StaticResource SizeConverter}}" />
</DockPanel>
<DockPanel Name="Col2" Grid.Column="1">
<TextBox Text="Text 2" Margin="5" HorizontalAlignment="Left" MinWidth="100" MaxWidth="300"
Width="{Binding ElementName=Col2, Path=ActualWidth, Mode=OneWay, Converter={StaticResource SizeConverter}}" />
</DockPanel>
<DockPanel Name="Col3" Grid.Column="2" >
<TextBox Text="Text 3" Margin="5" HorizontalAlignment="Left" MinWidth="100" MaxWidth="300"
Width="{Binding ElementName=Col3, Path=ActualWidth, Mode=OneWay, Converter={StaticResource SizeConverter}}" />
</DockPanel>
</Grid>
</Window>
然后,正如您在 XAML 中看到的那样,您需要一个转换器,它将 TextBox 大小设置为父对象减去左右边距。
using System;
using System.Windows.Data;
namespace TestTextAlignment
{
public class ColumnSizeToTextBoxSizeConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return (double)value - LeftMargin - RightMargin;
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
#endregion
public double LeftMargin { get; set; }
public double RightMargin { get; set; }
}
}
注意:您可以增强转换器以将左右边距作为转换参数,以便可以使用一个转换器将不同大小发送到任何元素。