这似乎应该很容易,但我很难过。在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>
诀窍是什么?
答案 0 :(得分:86)
您可以将HorizontalAlignment
设置为左,设置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>
答案 1 :(得分:44)
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" MaxWidth="200"/>
</Grid.ColumnDefinitions>
<TextBox Background="Azure" Text="Hello" />
</Grid>
答案 2 :(得分:8)
两个答案都适用于我说过的问题 - 谢谢!
在我的真实应用程序中,我试图限制ScrollViewer内部的一个面板,Kent的方法由于某些原因我没有理由去追踪,因此无法很好地处理。基本上控件可能会扩展到MaxWidth设置之外并且打败了我的意图。
Nir的技术运作良好,没有ScrollViewer的问题,尽管有一点需要注意。您希望确保TextBox上的右边距和左边距设置为0,否则它们会妨碍。我还更改了绑定以使用ViewportWidth而不是ActualWidth来避免出现垂直滚动条时出现问题。
答案 3 :(得分:6)
您可以将其用于DataTemplate的宽度:
Width="{Binding ActualWidth,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type ScrollContentPresenter}}}"
确保您的DataTemplate root具有Margin =“0”(您可以使用某个面板作为根并将边距设置为该根的子节点)
答案 4 :(得分:0)
我会使用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>
答案 5 :(得分:0)
也许我仍然可以帮助遇到这个问题的人,因为这是一个非常老的问题。
我也需要这个,并写了一个行为来解决这个问题。所以这是行为:
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
命名空间来使用行为。
答案 6 :(得分:0)
功能类似于已接受的答案,但不需要指定父元素:
<TextBox
Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}}"
MaxWidth="500"
HorizontalAlignment="Left" />
答案 7 :(得分:0)
在我的情况下,我必须将文本框放入堆栈面板中,以便在左侧拉伸文本框。 感谢以前的帖子。 仅作为示例,我确实设置了背景颜色以查看窗口大小更改时发生的情况。
<StackPanel Name="JustContainer" VerticalAlignment="Center" HorizontalAlignment="Stretch" Background="BlueViolet" >
<TextBox
Name="Input" Text="Hello World"
MaxWidth="300"
HorizontalAlignment="Right"
Width="{Binding ActualWidth, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type FrameworkElement}}}">
</TextBox>
</StackPanel>