【问题标题】:Stop TextBox in ScrollViewer from growing with content阻止 ScrollViewer 中的 TextBox 随内容一起增长
【发布时间】:2015-09-02 01:34:51
【问题描述】:

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

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

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

<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 约束,也会出现水平滚动条:

【问题讨论】:

    标签: wpf wpf-controls


    【解决方案1】:

    这似乎是一个普遍的问题,但我在网上没有找到令人满意的解决方案。

    这是我的解决方案:

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

    c#

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

    如果这有帮助或者您有任何反馈,请告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-11
      • 2012-03-20
      • 1970-01-01
      • 2016-03-13
      • 1970-01-01
      相关资源
      最近更新 更多