【问题标题】:Flexible XAML-only layout. Is it possible?灵活的仅 XAML 布局。可能吗?
【发布时间】:2023-03-22 12:19:01
【问题描述】:

我想创建一个可调整大小的窗口,它最初会自动调整到其内容。 如果窗口的大小达到某些限制,自动调整大小将被禁用,并且不断增长的控件将被剪切或显示为滚动条。 当用户调整窗口大小时,自动调整大小也必须关闭。

真正的任务是使用文本控件创建方便的可调整大小的对话框窗口。 当它包含的文本行不多且不少时,最初自动调整对话框大小是合理的。文本量增加,对话框变大。当然它必须有一些大小限制。

附:我认为定义布局是一项非常常见的任务,其中在布局的测量传递期间大小的指导作用有条件地从子级切换到父级并返回。

分享您的想法或现有解决方案。可能是我错过了一些东西。 谢谢。

更新 1

让我解释一下算法:

1) 显示窗口(假设所有数据/内容都已设置)。

2) 它的大小被调整为好像窗口的属性是:

最大高度 = ...

最大宽度 = ...

SizeToContent = "WidthAndHeight"

3) 用户尝试调整窗口大小。他可以做到。内部控件会相应地改变它们的大小。

这种行为等同于属性集:

MaxWidth= "{x:Ststic Double.PositiveInfinity}"

MaxHeight = "{x:Ststic Double.PositiveInfinity}"

SizeToContent = "手动"

ResizeMode = "CanResizeWithGrip"

【问题讨论】:

  • 听起来好像您只需要为控件设置最小/最大尺寸,并在必要时包含可滚动面板。到目前为止,您尝试了哪些方法,您在哪些部分遇到了问题?
  • 是的,但是您忘记了用户。我想让他手动无限制地调整窗口大小。设置 MaxHeight 和 MaxWidth 会终止此功能。
  • MaxHeightMaxWidth 单个控件,而不是窗口。
  • 在这种情况下,控件将不可拉伸。考虑具有唯一文本框的窗口。文本框首先确定窗口的大小,但有一些限制。然后在调整窗口大小时拉伸。换句话说,您的解决方案仅适用于初始大小。如果不允许用户调整窗口大小也没关系。

标签: wpf layout


【解决方案1】:

是的,您可以使用 XAML 仅使用动画/触发器来完成此操作,但这有点棘手。 只需挂钩 TextBlock Loaded 事件(仅限 xaml)并使用动画更改 EventTrigger 内的 SizeToContent=manual && MaxWidth&MaxHeight=PosInfinity。

【讨论】:

  • 这是个主意,谢谢。如果一切正常,我会尝试并稍后接受这个作为答案。唯一的问题是它是否可以以某种方式适应用户调整大小的操作。我想保存自动调整大小功能直到这一刻,因为数据可以通过绑定动态更改。不过,非常感谢。
  • 这很具体。据我所知,没有办法。主要是因为您无法区分 USER RESIZE 操作和 WPF RESIZE 操作。您需要定义新事件,当用户第一次开始拖动并在 XAML 中监听它时将引发该事件。为了生成该事件,您需要将自己连接到 WPF WINdow 的 WndProcedure,如果您愿意,我可以为您提供更多信息。
  • 查看此链接; 10rem.net/blog/2010/01/09/… 如果它死了,你可以用谷歌搜索它。每次用户调整窗口大小时都会触发 Resizing 事件。如果您让用户双击您的对话框,您可能还需要处理最大化/标准化事件。如果您想将其提升到一个新的水平,您可能可以使用附加行为而不使用任何背后的代码。但这并不容易,因为您需要注册自己的事件并通过可视化树进行传播。
【解决方案2】:

许多 WPF 面板会根据其子级自动调整大小。我建议阅读这篇文章以了解 WPF 中可用的布局面板类型:WPF Layouts: A Visual Quick Start

但要回答您的问题,请将您想要自动调整大小的所有控件放置在自动拉伸其子项的面板中,例如 GridDockPanel,并设置 MaxHeightMaxWidth 的属性面板以防止其增长超过一定的高度/宽度。

<Grid MaxHeight="100" MaxWidth="200">
    <!-- Place your content here -->
</Grid>

根据包含您的面板的父控件的默认行为,您可能还需要将HorizontalAlignmentVerticalAlignment 设置为Stretch 以外的其他值。

<Grid>
    <Grid MaxHeight="100" MaxWidth="200" HorizontalAlignment="Left" VerticalAlignment="Top">
        <!-- Place your content here -->
    </Grid>
</Grid>

如果您想要 ScrollBar 而不是剪辑内容,请在 Grid 内添加 ScrollViewer

【讨论】:

  • Rachel,感谢您的帮助,但通过 MaxHeight 和 MaxWidth 设置大小限制会使控件不可拉伸。任务是将这两个功能结合起来。请在我的问题下查看 cmets。
  • @voroninp 您是否尝试过第二部分,大约取决于父控件的默认行为,您可能需要将HorizontalAlignmentVerticalAlignment 更改为Stretch 以外的其他内容?当设置为Stretch 时,孩子将根据面板的大小调整大小。如果没有,面板将根据孩子的大小调整大小。
  • @voroninp 很抱歉,我还是不太明白您的要求。也许您可以包含您当前的 XAML 及其功能以及您想要的行为?使用 WPF 制作动态布局真的很容易,所以我不确定我是否理解您正在寻找的内容。
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 2013-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-12-31
  • 2015-12-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多