将ContentPresenter的宽度限制为其动态内容

时间:2011-05-13 18:23:21

标签: wpf layout contentpresenter

我希望能够动态调整内容控件的大小。

这是一个简单的例子:

...
<Slider x:Name="width" Minimum="40" Value="100" Maximum="300"/>
...
<ContentPresenter Width="{Binding Value, ElementName=width}" Content="Some value">
   <ContentPresenter.ContentTemplate>
      <DataTemplate>
         <Grid MaxWidth="200" MinWidth="80">
            <Rectangle Fill="Wheat" />
            <TextBlock Text="{Binding}"/>
         </Grid>
      </DataTemplate>
   </ContentPresenter.ContentTemplate>
</ContentPresenter>

在这个例子中,我想强制内容ContentPresenter的宽度保持在其生成的子节点的最小和最大宽度内(在这种情况下为80 - 200)。

显然,通过这样一个简单的例子我可以改变滑块的范围,但我的真实场景更复杂。我正在尝试将弹出屏幕的大小限制为其生成的内容。我无法在弹出窗口中设置明确的范围,因为我不知道内容将会是什么样的。内容必须能够限制自己。

不幸的是,孩子们的MaxWidth和MinWidth几乎被忽略了。当父级设置得较小时,MinWidth会导致裁剪。 MaxWidth会产生大量空白空间。看起来我必须在动态更新宽度值的相同位置设置MaxWidth和MinWidth。

1 个答案:

答案 0 :(得分:0)

我的建议是将ContentPresenter替换为自定义面板(如果无法替换,请将ContentPresenter中的自定义面板包含在内),以您想要的方式实现所需的确切尺寸。声明一个派生自Panel的类然后覆盖MeasureOverride和ArrangeOverride是相当容易和简单的。在这种情况下,您可以使用基础MeasureOverride测量所有内容,然后只需将您想要的大小指定为可用空间。在ArrangeOverride中,只需将面板的直接子项指定为面板的最终大小(rect = 0,0,width,height)。