2012-10-23 76 views
1

注:我翻閱了這個問題及其答案:HorizontalAlignment=Stretch, MaxWidth, and Left aligned at the same time?。他們都沒有做我正在尋找的東西。將Horizo​​ntalAlignment設置爲Stretch和Left的TextBox


我有下面的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> 

它產生這樣的:

Three Text Boxes Centered in their columns

這種設置具有很大的支持改變大小。如果窗口縮小,那麼文本框也會縮小。

唯一的問題是我需要他們左對齊:

Show where I want the textboxes

所有的解決方案我看到最終斬去文本框(不縮水的話)的一部分。

我正在尋找可能與WPF?

回答

4

找到了答案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> 
+0

這確認的偉大工程 – LostSalad

0

你在做什麼實際上是相當複雜的。

你實際上希望它左對齊。這很容易。將其設置爲Horizo​​ntalAlignment =「左」。

您希望最小尺寸和最大尺寸以及在窗口大小調整時在這些尺寸之間增長的能力。

首先,您需要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看,你需要一個轉換器,將文本框的大小設置爲父對象減去左右邊距。

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; } 
    } 
} 

注意:您可以提高轉換採取左,右頁邊距作爲轉換參數,這樣一個轉換器可用於不同尺寸發送到任何元素。

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> 
相關問題