Wpf 停止ScrollViewer中的文本框随内容增长
我有一个ScrollViewer,其中HorizontalScrollBarVisibility设置为“自动”,其中包含一个文本框。问题是,当用户输入文本时,文本框会不断增长以显示整个内容。我需要更改什么,以便文本框只获取可用宽度(但不小于给定的最小宽度) 仅当可用的水平空间不足以满足给定的最小宽度时,水平滚动条才会出现 只有当有更多的水平空间可用时,文本框才会增长Wpf 停止ScrollViewer中的文本框随内容增长,wpf,wpf-controls,Wpf,Wpf Controls,我有一个ScrollViewer,其中HorizontalScrollBarVisibility设置为“自动”,其中包含一个文本框。问题是,当用户输入文本时,文本框会不断增长以显示整个内容。我需要更改什么,以便文本框只获取可用宽度(但不小于给定的最小宽度) 仅当可用的水平空间不足以满足给定的最小宽度时,水平滚动条才会出现 只有当有更多的水平空间可用时,文本框才会增长 <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScr
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*" MinWidth="50"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Text="test:"/>
<TextBox Grid.Column="1"/>
</Grid>
</ScrollViewer>
即使满足MinWidth约束,也会显示水平滚动条:
这似乎是一个常见的问题,但我还没有在网上找到令人满意的解决方案 以下是我的解决方案:
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="50"/>
<ColumnDefinition Width="*" MinWidth="100"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Grid.Column="0" Text="test:"/>
<local:TextBoxDecorator Grid.Column="1">
<TextBox Text="content content content content content content"/>
</local:TextBoxDecorator>
</Grid>
</ScrollViewer>
让我知道这是否有用,或者您是否有任何反馈
public class TextBoxDecorator : Decorator {
// properties
public override UIElement Child {
get {
return base.Child;
}
set {
var oldValue = base.Child;
if (oldValue != null) {
var binding = BindingOperations.GetBinding(oldValue, FrameworkElement.WidthProperty);
if ((binding != null) && (binding.Source == this))
BindingOperations.ClearBinding(oldValue, FrameworkElement.WidthProperty);
}
base.Child = value;
if ((value != null) &&
BindingOperations.GetBinding(value, FrameworkElement.WidthProperty) == null)
BindingOperations.SetBinding(
value,
FrameworkElement.WidthProperty,
new Binding() {
Source = this,
Path = new PropertyPath(FrameworkElement.ActualWidthProperty),
Mode = BindingMode.OneWay
});
}
}
// methods
protected override Size MeasureOverride(Size constraint) {
Size result = base.MeasureOverride(constraint);
if (double.IsInfinity(constraint.Width))
result.Width = (Child as FrameworkElement)?.MinWidth ?? 0.0;
return result;
}
}