如果设置了面板的MaxWidth,如何阻止面板的子节点超出界限?

时间:2011-01-16 05:04:35

标签: wpf layout wpf-controls

我在GridsStackPanels中发现了这个问题,它也可能适用于其他面板,请考虑以下Xamls:

<Grid MaxWidth="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="Auto"/>
    </Grid.ColumnDefinitions>
    <Label>Title:</Label>
    <TextBox Grid.Column="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

<StackPanel MaxWidth="200">
    <Label>Title:</Label>
    <TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"/>
</StackPanel>

(编辑:我有几个这样的变量块,这就是为什么我没有设置MaxWidth本身的TextBox

当然我想要的是,在文本输入时,如果达到父TextBoxMaxWidth不会变得更大,但是这不会发生,面板会调整大小直到它到达{{ 1}}和MaxWidth在范围之外射击。

如果第二个网格列没有定义宽度(默认情况下是一个星形),TextBox将不会增长,因为它只占用所有可用空间,因此文本滚动就像我想要的那样但是这个面板是一个TextBox中的项目,如果ToolBar处于水平ToolBar,此设置会导致即时溢出。

关于如何让TextBox不超出范围的任何想法?

编辑:答案(可能)在正常情况下工作,但工具栏以某种方式拧紧我的布局,一方面我的控件总是被推入ToolBar溢出区域,无论出于何种原因和内容在网格单元内拉伸不再这样做。由于我最初的问题是如何防止这种内部溢出(而不是如何应对ToolBar的特性),我将把它留在那里。

3 个答案:

答案 0 :(得分:1)

将第二个ColumnDefinition Width更改为*,将文本框Horizo​​ntalAlignment设置为stretch,将TextWrapping设置为Wrap以获得所需效果(请参阅下面的XAML)

<Grid x:Name="myGrid" MinWidth="200" MaxWidth="200">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>
    <Label>Title:</Label>
    <TextBox Margin="5" TextWrapping="Wrap" Grid.Column="1" Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}"
             HorizontalAlignment="Stretch"/>
</Grid>

编辑:您可以创建要应用于文本框的样式,这样您就不必再为其他文本框设置相同的属性。

答案 1 :(得分:1)

另一种可能性:

    <DockPanel MaxWidth="200">
        <Label DockPanel.Dock="Left" VerticalAlignment="Center">Title:</Label>
        <TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" 
                 TextWrapping="Wrap" VerticalAlignment="Center"/>
    </DockPanel>

答案 2 :(得分:0)

我不确定它是否与您的应用程序要求相矛盾,但您是否尝试设置TextBox的MaxLength?