gpt4 book ai didi

c# - 你如何计算 WPF 中客户区的偏移量?

转载 作者:行者123 更新时间:2023-11-30 21:23:01 25 4
gpt4 key购买 nike

我想在父窗口客户区的右上角放置一个模态对话框(进度窗口)。

这段代码会把它放在非客户区的角落里,但是如何计算到客户区的偏移量呢?

this.Owner=owner;
this.Left=owner.Left+owner.ActualWidth-Width;
this.Top=owner.Top;

编辑:

我发现这个“解决方案”适用于普通窗口:

this.Left=owner.Left+owner.ActualWidth-Width-SystemParameters.ResizeFrameVerticalBorderWidth;
this.Top=owner.Top+SystemParameters.ResizeFrameHorizontalBorderHeight+SystemParameters.WindowCaptionHeight;

然而,对于具有自定义边框的窗口,这将失败。

编辑:

无论系统 DPI 设置如何(例如 120 而不是 96),代码都应该有效。

最佳答案

只要您的窗口内容是 UIElement 的子类(通常是这种情况),您就可以简单地检查内容覆盖的区域:

Matrix scaling = PresentationSource.FromVisual(windowContent)
.CompositionTarget.TransformFromDevice;

UIElement windowContent = owner.Content as UIElement;

Point upperRightRelativeToContent = new Point(
windowContent.RenderSize.Width + owner.Margin.Right,
-owner.Margin.Top);

Point upperRightRelativeToScreen =
windowContent.PointToScreen(upperRightRelativeToContent);

Point upperRightScaled =
scaling.Transform(upperRightRelativeToScreen);

this.Owner = owner;
this.Left = upperRightScaled.X - this.Width;
this.Top = upperRightScaled.Y;

如果您遇到一种奇怪的情况,您希望它适用于任意 Window.Content,则必须使用 VisualTreeHelper.GetChildCount() 搜索窗口的可视化树> 和 VisualTreeHelper.GetChild(),直到您到达一个 ContentPresenter,其 Content 属性与 Window 的属性相匹配,并在上面的代码中使用它的第一个可视子项作为“windowContent”。

关于c# - 你如何计算 WPF 中客户区的偏移量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2026468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com