2012-10-23 2 views
1

참고 :이 질문에 대한 답변 : HorizontalAlignment=Stretch, MaxWidth, and Left aligned at the same time?. 그들 중 누구도 내가 원하는 것을하지 않습니다. 그것은이 생산HorizontalAlignment가 Stretch AND Left로 설정된 TextBox

<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

이 설정은이 큰 크기 조정 지원


나는 다음과 같은 XAML 있습니다. 창이 축소되면 TextBox도 축소됩니다.

유일한 문제는 내가 그들을이 왼쪽 정렬이 필요하다 :

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

실제로 수행하는 작업은 실제로 복잡합니다.

실제로는 왼쪽 정렬이 필요합니다. 쉽습니다. HorizontalAlignment = "Left"로 설정하십시오.

최소 크기 및 최대 크기와 창 크기를 조정할 때 이러한 크기 사이에서 커지는 기능이 필요합니다.

먼저 TextBox의 열과 행 사이에 부모가 있어야 열의 전체 너비까지 확장됩니다. 당신은 XAML에서 보는 바와 같이

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

그런 다음 당신은 부모 객체를 뺀 왼쪽 및 오른쪽 여백에 텍스트 상자의 크기를 설정합니다 컨버터가 필요합니다.

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>