2

注:この質問とその回答を読みました:Horizo​​ntalAlignment = Stretch、MaxWidth、およびLeftalignedを同時に実行しますか?。それらのどれも私が探していることをしません。


私は次の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>

これを生成します:

列の中央に配置された3つのテキストボックス

このセットアップには、優れたサイズ変更サポートがあります。ウィンドウが縮小すると、TextBoxも縮小します。

唯一の問題は、それらを左揃えにする必要があることです。

テキストボックスが必要な場所を表示する

私が見るすべての解決策は、テキストボックスの一部を切り刻むことになります(縮小するのではありません)。

私が探しているものは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

次のような専用のパネルにTextBoxを配置することもできます。

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と、列の全幅に拡張される列との間に親が必要です。

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

注:コンバーターを拡張して、左右のマージンを変換パラメーターとして取り込むことができるため、1つのコンバーターを使用して、任意の要素に異なるサイズを送信できます。

于 2012-10-23T22:36:28.203 に答える