2

注意:我阅读了这个问题及其答案:Horizo​​ntalAlignment=Stretch、MaxWidth 和 Left 同时对齐?. 他们都没有做我正在寻找的东西。


我有以下 xaml:

<Grid ShowGridLines="True" x:Name="_testGrid" Height="30" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition Width="*"></ColumnDefinition>
    <ColumnDefinition Width="*"></ColumnDefinition>
    <ColumnDefinition Width="*"></ColumnDefinition>
  </Grid.ColumnDefinitions>

  <TextBox Text="Text 1" HorizontalAlignment="Stretch"
          MaxWidth="75" Margin="5"/>
  <TextBox Grid.Column="1" Text="Text 2" Margin="5"                 
       HorizontalAlignment="Stretch" MaxWidth="130"/>
  <TextBox Grid.Column="2"  Text="Text 3" Margin="5"               
       HorizontalAlignment="Stretch" MaxWidth="100"/>
</Grid>

它产生这个:

三个文本框在它们的列中居中

此设置具有很好的调整大小支持。如果窗口缩小,那么 TextBoxes 也会缩小。

唯一的问题是我需要它们左对齐:

显示我想要的文本框

我看到的所有解决方案最终都会切断部分文本框(而不是缩小它)。

我正在寻找的 WPF 是否可行?

4

3 回答 3

5

在这里找到了答案。

它仅适用于网格。这是更新的 xaml:

<Grid ShowGridLines="True" x:Name="_testGrid" Height="30" >
  <Grid.ColumnDefinitions>
    <ColumnDefinition MaxWidth="75" Width="*"/>
    <ColumnDefinition Width="0.01*" />
    <ColumnDefinition MaxWidth="130" Width="*"/>
    <ColumnDefinition Width="0.01*" />
    <ColumnDefinition MaxWidth="100" Width="*"/>
    <ColumnDefinition Width="0.01*" />
  </Grid.ColumnDefinitions>

  <TextBox Grid.Column="0" Text="Text 1" Margin="5"/>
  <TextBox Grid.Column="2" Text="Text 2" Margin="5"  />
  <TextBox Grid.Column="4" Text="Text 3" Margin="5" />
</Grid>
于 2012-10-23T22:21:15.023 回答
2

您也可以将您的文本框放在一个专门的面板中,如下所示:

public class LeftStretchPanel : Panel
{
    protected override Size MeasureOverride(Size availableSize)
    {
        foreach (UIElement element in InternalChildren)
        {
            element.Measure(availableSize);
        }

        return new Size();
    }

    protected override Size ArrangeOverride(Size arrangeBounds)
    {
        foreach (UIElement element in InternalChildren)
        {
            double width = arrangeBounds.Width;
            FrameworkElement fwElement = element as FrameworkElement;

            if (fwElement != null && width > fwElement.MaxWidth)
            {
                width = fwElement.MaxWidth;
            }

            element.Arrange(new Rect(0, 0, width, arrangeBounds.Height));
        }

        return arrangeBounds;
    }
}

您的 XAML 将如下所示:

<Grid ShowGridLines="True" Height="30">
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <local:LeftStretchPanel Grid.Column="0" Margin="5">
        <TextBox Text="Text 1" MaxWidth="75"/>
    </local:LeftStretchPanel>
    <local:LeftStretchPanel Grid.Column="1" Margin="5">
        <TextBox Text="Text 2" MaxWidth="130"/>
    </local:LeftStretchPanel>
    <local:LeftStretchPanel Grid.Column="2" Margin="5">
        <TextBox Text="Text 3" MaxWidth="100"/>
    </local:LeftStretchPanel>
</Grid>
于 2012-10-23T23:06:53.543 回答
0

你正在做的实际上是相当复杂的。

您实际上希望它左对齐。这很容易。将其设置为 Horizo​​ntalAlignment="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; }
    }
}

注意:您可以增强转换器以将左右边距作为转换参数,以便可以使用一个转换器将不同大小发送到任何元素。

于 2012-10-23T22:36:28.203 回答