【问题标题】:TextBox with HorizontalAlignment set to both Stretch AND Left将 Horizo​​ntalAlignment 设置为 Stretch AND Left 的 TextBox
【发布时间】:2012-10-13 21:34:02
【问题描述】:

注意:我阅读了这个问题及其答案:HorizontalAlignment=Stretch, MaxWidth, and Left aligned at the same time?。他们都没有做我想要的。


我有以下 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>

它产生这个:

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

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

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

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

【问题讨论】:

    标签: .net wpf xaml alignment


    【解决方案1】:

    找到答案here

    它只适用于网格。这是更新的 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>
    

    【讨论】:

      【解决方案2】:

      您正在做的事情实际上非常复杂。

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

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

      【讨论】:

        【解决方案3】:

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

        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>
        

        【讨论】:

          猜你喜欢
          • 2010-09-21
          • 2016-10-28
          • 2019-01-26
          • 2011-05-21
          • 1970-01-01
          • 2018-01-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多