【问题标题】:How to stop a panel's children from exceeding the bounds if the panel's MaxWidth is set?如何阻止面板的子项超出设置的面板最大宽度的范围?
【发布时间】:2011-06-09 21:19:34
【问题描述】:

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

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

当然我想要的是,在文本输入时,如果达到父级的 MaxWidthTextBox 不会变大,但这不会发生,面板调整大小直到达到 MaxWidth 和 @ 987654330@射门出界。

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

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

编辑:答案(可能)在正常情况下有效,但工具栏以某种方式破坏了我的布局,一方面,无论出于何种原因和之前的内容,我的控件总是被推入工具栏溢出区域在网格单元内拉伸不再这样做。由于我最初的问题是如何防止这种内部溢出(而不是如何应对工具栏的特殊性),所以我就这样吧。

【问题讨论】:

  • 我发现 StackPanel 没有给它的孩子提供任何尺寸建议,而是纯粹将孩子安排在一个堆栈中。对于这种情况,我要么使用 Grid(在下面的答案中建议使用参数),要么使用 DockPanel。

标签: wpf layout wpf-controls


【解决方案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>

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

【讨论】:

  • 由于工具栏的原因不能解决我的问题,但它是我猜想的原始问题的答案。
  • 我刚刚在 ToolBar 中测试了我的更改,但正如您所说,它确实溢出了 - 似乎没有禁用此功能的属性;我认为这需要一个自定义的 ControlTemplate。为什么不直接将 Panel 停靠在表单顶部并更改边框和背景属性使其看起来像一个,而不是 ToolBar?
  • ToolBars 的重点是能够在 ToolBarTray 中重新排列它们,如果这不是我需要的,我不会使用 ToolBars,因为它们通常很痛苦。
【解决方案2】:

另一种可能性:

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

【讨论】:

  • 感谢您的回答,遗憾的是,这也不适用于我的 ToolBar 设置,请参阅问题末尾的说明。
【解决方案3】:

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

【讨论】:

  • 这不是一个选项,因为有几个这样的标签-文本框对,我希望它们都自动停在右边缘而不测量每个可以得到多少空间。
猜你喜欢
  • 1970-01-01
  • 2013-12-25
  • 1970-01-01
  • 2017-06-23
  • 2013-06-15
  • 1970-01-01
  • 2017-12-03
  • 2015-01-18
  • 2017-04-27
相关资源
最近更新 更多