Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 停止ScrollViewer中的文本框随内容增长_Wpf_Wpf Controls - Fatal编程技术网

Wpf 停止ScrollViewer中的文本框随内容增长

Wpf 停止ScrollViewer中的文本框随内容增长,wpf,wpf-controls,Wpf,Wpf Controls,我有一个ScrollViewer,其中HorizontalScrollBarVisibility设置为“自动”,其中包含一个文本框。问题是,当用户输入文本时,文本框会不断增长以显示整个内容。我需要更改什么,以便文本框只获取可用宽度(但不小于给定的最小宽度) 仅当可用的水平空间不足以满足给定的最小宽度时,水平滚动条才会出现 只有当有更多的水平空间可用时,文本框才会增长 <ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScr

我有一个ScrollViewer,其中HorizontalScrollBarVisibility设置为“自动”,其中包含一个文本框。问题是,当用户输入文本时,文本框会不断增长以显示整个内容。我需要更改什么,以便文本框只获取可用宽度(但不小于给定的最小宽度)

仅当可用的水平空间不足以满足给定的最小宽度时,水平滚动条才会出现

只有当有更多的水平空间可用时,文本框才会增长

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