これは簡単なはずですが、私は困惑しています。 WPFでは、親の幅まで伸びるが最大幅までしか伸びないTextBoxが欲しいです。問題は、その親内で左揃えにすることです。ストレッチするには、HorizontalAlignment = "Stretch"を使用する必要がありますが、結果は中央に配置されます。 HorizontalContentAlignmentを試しましたが、何もしないようです。
この青いテキストボックスをウィンドウのサイズに合わせて拡大し、最大幅を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>
トリックは何ですか?
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>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MaxWidth="200"/>
</Grid.ColumnDefinitions>
<TextBox Background="Azure" Text="Hello" />
</Grid>
与えられた両方の答えは、私が述べた問題のために働いた-ありがとう!
しかし、実際のアプリケーションでは、ScrollViewer内のパネルを制約しようとしており、Kentのメソッドは何らかの理由でそれをうまく処理できませんでした。基本的に、コントロールはMaxWidth設定を超えて拡張し、意図を打ち破ることができました。
Nirのテクニックはうまく機能し、ScrollViewerに問題はありませんでしたが、注意すべきマイナーな点が1つあります。 TextBoxの左右のマージンが0に設定されていることを確認する必要があります。そうしないと邪魔になります。また、ActualWidthの代わりにViewportWidthを使用するようにバインディングを変更して、垂直スクロールバーが表示されたときの問題を回避しました。
これをDataTemplateの幅に使用できます。
Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"
DataTemplateルートにMargin = "0"があることを確認します(一部のパネルをルートとして使用し、Marginをそのルートの子に設定できます)
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>
これは非常に古い問題なので、この質問にぶつかった人を助けることができるかもしれません。
これも必要であり、これを処理するための動作を記述しました。動作は次のとおりです。
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
動作を使用する名前空間。