【问题标题】:Unscaled Controls in scaled parents缩放父级中的未缩放控件
【发布时间】:2016-04-28 09:14:05
【问题描述】:

我有一个 WPF UserControl,其作用类似于视口(在以下上下文中我将其称为“视口”)。此视口可以缩放和平移其内容(我认为缩放使用 Layout- 或 RenderTransform 来缩放内容)。基本上内容只是一个画布。这个画布包含一些形状和一些用于显示形状元数据的文本框。 如果缩放因子为 1,一切都很好,但如果我缩小,画布会缩小,文本框也会缩小,这会导致元数据不可读,因为文本太小了。

如何强制文本框进行反缩放,以便它们不会改变屏幕上的大小?

我曾考虑将视口的变换(导致缩放)传递给文本框(不知何故)并将其逆向应用于它们,但这对我来说似乎是错误的。 另一种方法是使用包含 TextBoxes 的 Adorner。我发现了一个关于 Adorners with Controls here on Stackoverflow 的话题,但我不确定这种方法是否比另一种更好。

因此,如果有人有更好的解决方案,我将不胜感激。

提前致谢

【问题讨论】:

    标签: c# wpf adorner rendertransform layouttransform


    【解决方案1】:

    有一个Transform.Inverse 属性,您可以使用它来“撤消”父控件的转换。因此,您基本上将父控件绑定到 MyTransform,并将所有子控件绑定到 MyTransform.Inverse。这样,变换将应用于孩子的位置,而不是他们的大小。

    我同意它“感觉不对”,但我很确定这是您的最佳选择。

    【讨论】:

    • 问题是视口的内容应该被缩放。但是内容的内容不应该被缩放。我通过创建一个用作数据上下文的类来解决它。此类拥有一个属性,该属性存储表示比例的双精度数。视口具有属性“ContentScale”和相应的更改事件。所以基本上我将 ContentScale 绑定到我的数据上下文,该上下文再次绑定到应该未缩放的控件。在控件中,我将双精度转换为 ScaleTransform(x 和 y 为 1/ContentScale)。
    • 我想我理解正确 - 绑定到您的父变换的 Inverse-property 应该会给您与您现在手动执行的完全相同的效果。视口内的所有内容都将继续按预期缩放,除了您明确应用 ViewPort.RenderTransform.Inverse 的所有子项。无论如何,很高兴你能成功。
    • 是的,绑定变换会使事情变得更容易,但正如我所说,我不太确定是否实际使用了其中一个变换并且视口是一个黑盒子。但是感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-20
    • 2015-06-21
    • 1970-01-01
    • 2017-06-19
    • 1970-01-01
    相关资源
    最近更新 更多