【问题标题】:WPF: ScrollViewer & Grid - Disable TexBox resizingWPF: ScrollViewer & Grid - 禁用 TexBox 调整大小
【发布时间】:2015-09-07 12:05:17
【问题描述】:

考虑以下 XAML 示例。

  1. 我有一个 ScrollViewer。如果窗口对于网格来说太小,滚动条将可见。
  2. 在 ScrollViewer 中是 Grid。网格中的所有项目都应拉伸到网格的列宽。
  3. 现在有文本框(文本很长)。

我的问题是,如果文本越来越大,文本框会越来越大。但我只是希望文本框适合网格空间。

如何禁用带有大文本的文本框调整大小?

<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="30" />
            <RowDefinition Height="30" />
            <RowDefinition Height="26" />
            <RowDefinition Height="26" />
            <RowDefinition Height="26" />
            <RowDefinition Height="26" />
            <RowDefinition Height="26" />
            <RowDefinition Height="26" />
            <RowDefinition Height="10*" />
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition Width="*" MinWidth="130" />
            <ColumnDefinition Width="130" />
        </Grid.ColumnDefinitions>

        <Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 1"  Grid.Column="0" Grid.Row="0"/>
        <TextBox x:Name="Tbox1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf  safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="0" />

        <Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 2"  Grid.Column="0" Grid.Row="1"/>
        <TextBox x:Name="Tbox2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf  safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" Grid.Row="1" />

    </Grid>
</ScrollViewer>

【问题讨论】:

  • 不确定是否理解您的问题,但如果您的文本框应始终为固定宽度,为什么不将其宽度设置为所需值?

标签: wpf xaml


【解决方案1】:

您需要确保 TextBox 不会调整 Grid 的大小。

最简单的方法是将文本框放在这样的 容器中,忽略其子项的大小,例如Canvas。您还需要通过将其绑定到列宽来设置文本框大小。

<ScrollViewer HorizontalScrollBarVisibility="Auto">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100" />
            <ColumnDefinition x:Name="MiddleColumn" Width="*" MinWidth="130" />
            <ColumnDefinition Width="130" />
        </Grid.ColumnDefinitions>

        <Canvas Grid.Column="1">
            <TextBox Width="{Binding ActualWidth, ElementName=MiddleColumn}"/>
        </Canvas>

    </Grid>
</ScrollViewer>

但是,请注意,画布也会忽略 TextBox 的高度,如果文本被换行,则不会调整行的大小。您可以通过 DataBinding Canvas 高度到 TextBox.ActualHeight 来解决它。您可以将此布局绑定封装为可重用样式:

<ContentControl Grid.Column="1" Style="{StaticResource IgnoreContentWidthStyle}">
    <TextBox Text="asfasdf asdfad sfa sdf" TextWrapping="Wrap"/>
</ContentControl>

<Style x:Key="IgnoreContentWidthStyle" TargetType="ContentControl">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ContentControl">
                <Canvas Height="{Binding ActualHeight, ElementName=PART_Content}">
                    <ContentPresenter x:Name="PART_Content"
                                      Content="{TemplateBinding Content}"
                                      Width="{TemplateBinding ActualWidth}"/>
                </Canvas>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

或者,您可以创建从 Panel 或 Decorator 派生的自定义元素,这将覆盖 MeasureOverride 和 ArrangeChildren 并将文本框放置在其中。这种方法可以为您提供更好的性能,因为您避免了布局绑定。

【讨论】:

    【解决方案2】:

    好吧,我认为您有 2 个选项可以阻止文本框变大:

    1. 禁用水平滚动条
    2. 将文本框最大宽度绑定到另一个元素,如下所示:

          <Grid Grid.Column="1" Name="grdWidth"/>
      
          <Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 1"  Grid.Column="0" Grid.Row="0"/>
          <TextBox x:Name="Tbox1" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf  safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" 
          MaxWidth="{Binding ActualWidth, ElementName=grdWidth}" Height="22" Grid.Column="1" Grid.Row="0" />
      
          <Label VerticalAlignment="Center" HorizontalAlignment="Left" Content="Label 2"  Grid.Column="0" Grid.Row="1"/>
          <TextBox x:Name="Tbox2" VerticalAlignment="Center" HorizontalAlignment="Stretch" Text="asfas fasd fasdf asdf asdf asdf asdf asf  safasdf asdf asdf fasasd fas f" TextWrapping="Wrap" Height="22" Grid.Column="1" 
          MaxWidth="{Binding ActualWidth, ElementName=grdWidth}" 
          Grid.Row="1" />
      
      </Grid>
      

    我个人会选择第一个选项

    【讨论】:

    • 如果你数据绑定 maxwidth 并将窗口调整为更小的尺寸,滚动条就会出现
    • 我同意。 OP 说:“我的问题是,文本框会越来越大,以防文本变大。但我只想让文本框适合网格空间。”我就个人而言,不认为拥有不适合水平的网格是一个好主意,但我相信这就是 OP 想要的
    猜你喜欢
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2013-07-17
    • 1970-01-01
    相关资源
    最近更新 更多