web-dev-qa-db-ja.com

Horizo​​ntalAlignment = Stretch、MaxWidth、およびLeftを同時に配置しますか?

これは簡単なはずですが、私は困惑しています。 WPFでは、親の幅まで伸びるが最大幅までしか伸びないTextBoxが欲しいです。問題は、その親内で左揃えにすることです。ストレッチするには、Horizo​​ntalAlignment = "Stretch"を使用する必要がありますが、結果は中央に配置されます。 Horizo​​ntalContentAlignmentを試しましたが、何もしないようです。

この青いテキストボックスをウィンドウのサイズに合わせて拡大し、最大幅を200ピクセルにし、左揃えにする方法を教えてください。

<Page
  xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
  <StackPanel>  
    <TextBox Background="Azure" Text="Hello" HorizontalAlignment="Stretch" MaxWidth="200" />
  </StackPanel>
</Page>

トリックは何ですか?

89
Scott Bussinger

HorizontalAlignmentをLeftに設定し、MaxWidthを設定して、Widthを親要素のActualWidthにバインドできます。

<Page
  xmlns="http://schemas.Microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.Microsoft.com/winfx/2006/xaml">
  <StackPanel Name="Container">   
    <TextBox Background="Azure" 
    Width="{Binding ElementName=Container,Path=ActualWidth}"
    Text="Hello" HorizontalAlignment="Left" MaxWidth="200" />
  </StackPanel>
</Page>
86
Nir
<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*" MaxWidth="200"/>
    </Grid.ColumnDefinitions>

    <TextBox Background="Azure" Text="Hello" />
</Grid>
44
Kent Boogaart

与えられた両方の答えは、私が述べた問題のために働いた-ありがとう!

しかし、実際のアプリケーションでは、ScrollViewer内のパネルを制約しようとしており、Kentのメソッドは何らかの理由でそれをうまく処理できませんでした。基本的に、コントロールはMaxWidth設定を超えて拡張し、意図を打ち破ることができました。

Nirのテクニックはうまく機能し、ScrollViewerに問題はありませんでしたが、注意すべきマイナーな点が1つあります。 TextBoxの左右のマージンが0に設定されていることを確認する必要があります。そうしないと邪魔になります。また、ActualWidthの代わりにViewportWidthを使用するようにバインディングを変更して、垂直スクロールバーが表示されたときの問題を回避しました。

8
Scott Bussinger

これをDataTemplateの幅に使用できます。

Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"

DataTemplateルートにMargin = "0"があることを確認します(一部のパネルをルートとして使用し、Marginをそのルートの子に設定できます)

6
Filip Skakun

SharedSizeGroupを使用します

<Grid>
    <Grid.ColumnDefinition>
        <ColumnDefinition SharedSizeGroup="col1"></ColumnDefinition>  
        <ColumnDefinition SharedSizeGroup="col2"></ColumnDefinition>
    </Grid.ColumnDefinition>
    <TextBox Background="Azure" Text="Hello" Grid.Column="1" MaxWidth="200" />
</Grid>
0
Patrick Cairns

これは非常に古い問題なので、この質問にぶつかった人を助けることができるかもしれません。

これも必要であり、これを処理するための動作を記述しました。動作は次のとおりです。

public class StretchMaxWidthBehavior : Behavior<FrameworkElement>
{        
    protected override void OnAttached()
    {
        base.OnAttached();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged += this.OnSizeChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        ((FrameworkElement)this.AssociatedObject.Parent).SizeChanged -= this.OnSizeChanged;
    }

    private void OnSizeChanged(object sender, SizeChangedEventArgs e)
    {
        this.SetAlignments();
    }

    private void SetAlignments()
    {
        var slot = LayoutInformation.GetLayoutSlot(this.AssociatedObject);
        var newWidth = slot.Width;
        var newHeight = slot.Height;

        if (!double.IsInfinity(this.AssociatedObject.MaxWidth))
        {
            if (this.AssociatedObject.MaxWidth < newWidth)
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Left;
                this.AssociatedObject.Width = this.AssociatedObject.MaxWidth;
            }
            else
            {
                this.AssociatedObject.HorizontalAlignment = HorizontalAlignment.Stretch;
                this.AssociatedObject.Width = double.NaN;
            }
        }

        if (!double.IsInfinity(this.AssociatedObject.MaxHeight))
        {
            if (this.AssociatedObject.MaxHeight < newHeight)
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Top;
                this.AssociatedObject.Height = this.AssociatedObject.MaxHeight;
            }
            else
            {
                this.AssociatedObject.VerticalAlignment = VerticalAlignment.Stretch;
                this.AssociatedObject.Height = double.NaN;
            }
        }
    }
}

その後、次のように使用できます。

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto" />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>

    <TextBlock Grid.Column="0" Text="Label" />
    <TextBox Grid.Column="1" MaxWidth="600">
          <i:Interaction.Behaviors>                       
               <cbh:StretchMaxWidthBehavior/>
          </i:Interaction.Behaviors>
    </TextBox>
</Grid>

そして最後に、System.Windows.Interactivity動作を使用する名前空間。

0
Y C