【问题标题】:How to get the rendered size of a visual in WPF?如何在 WPF 中获取视觉对象的渲染大小?
【发布时间】:2017-11-03 01:06:44
【问题描述】:

我有一种情况,我需要在 WPF 上获取视觉元素的渲染大小。我的意思是,我需要获取视觉空间上某些东西所消耗的空间,例如应用了DropShadowEffectButton 而不仅仅是ActualWidthActualHeight 属性的值。

例如,考虑以下场景:

<Button Width="100" Height="100">
    <Button.Effect>
        <DropShadowEffect BlurRadius="10" ShadowDepth="0"/>
    </Button.Effect>
</Button>

如您所见,按钮的大小为 100x100,但由于它有一个模糊半径为 10 的阴影,因此需要 120x120 的渲染空间。

如何在 WPF 中获取此按钮的渲染大小(即 120x120)?

StackOverflow 上已经有另一个类似的问题,但没有得到确切的答案。所以我要问这个问题。


关于我要达到的目标的其他详细信息

我需要这个的情况如下:

我需要将自定义窗口的可视框架扩展到窗口边界之外。为了实现这一点,我在实际窗口的边界周围使用了 4 个其他相邻的窗口。在每个相邻的窗口中,我显示一个VisualBrush,它显示将在窗口外显示的内容(如投影),就像在普通控件上一样。但是要知道应用于每个相邻窗口的确切大小并使VisualBrush 的内容与主窗口内容对齐,我至少需要知道内容的大小和位置。

也许,也许还有另一种方法可以实现这一点......

【问题讨论】:

  • 额外的窗口对我来说似乎只会让事情变得复杂。将DockPanel 与您的“扩展”一起用作停靠在顶部、左侧、右侧和底部的元素,而实际内容停靠以填充中心不是更简单吗?这样一来,所有内容都包含在一个窗口中,该窗口会自动增长到适合内容和效果所需的任何大小,您无需担心诸如阴影之类的实际大小。
  • @BradleyUffner 好吧,我尝试了不同的方法来实现越界功能。对我来说,使用额外的“幽灵”窗口是迄今为止取得最佳效果的方法。用户不知道这些额外的窗口,并且从 shell 的角度来看,一切都按预期工作。我认为它就像 Visual Studio 一样,因为它的窗口周围有模糊效果。

标签: c# .net wpf xaml


【解决方案1】:

我能找到的方法是使用VisualTreeHelper.GetEffect方法,获取与视觉相关的效果,然后根据附加效果的类型进行一些手动计算。

https://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper.geteffect(v=vs.110).aspx

【讨论】:

    猜你喜欢
    • 2016-07-23
    • 1970-01-01
    • 2011-05-25
    • 2020-03-22
    • 1970-01-01
    • 2011-11-10
    • 2011-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多