WPF:ScrollViewer&网格 - 禁用TexBox调整大小

时间:2015-09-07 12:05:18

标签: wpf xaml

考虑以下XAML示例。

  1. 我有一个ScrollViewer。如果窗口对于网格而言太小,则会显示Srollbars。
  2. 在ScrollViewer中是Grid。网格中的所有项目都应拉伸到网格的列宽。
  3. 现在有文本框(文字很长)。
  4. 我的问题是,如果文字越来越大,文本框会变得越来越大。但我只想要,文本框适合网格空间。

    如何禁用内容较大的文本大小调整文本框?

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

2 个答案:

答案 0 :(得分:4)

您需要确保TextBox不会调整网格大小。

最简单的方法是将文本框放在这样的容器中,忽略其子容量,例如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 height将其解决为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并将文本框放在其中。这种方法可以提供更好的性能,因为您可以避免布局绑定。

答案 1 :(得分:1)

好吧,我认为你有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>
    

  3. 我个人会选择第一个选项