AvalonDock Dirkster:在 ILayoutUpdateStrategy 中将浮动 LayoutDocument 的位置设置为鼠标光标

问题描述 投票:0回答:1

在我的 LayoutUpdateStrategy 中,我将一些 LayoutDocuments 设置为 FloatingWindow。这是通过使用 Float() 来实现的。该窗口的位置是具有最小尺寸的主屏幕。通过 IsMaximized 我可以最大化。 我想要的是浮动窗口以特定大小出现在光标位置。 我以为

int floatingWindowWidth = 500;
int floatingWindowHeight = 300;

var cursorPosition = Cursor.Position;  
             
layoutDocument.FloatingWidth = floatingWindowWidth;
layoutDocument.FloatingHeight = floatingWindowHeight;
layoutDocument.FloatingLeft = cursorPosition.X - floatingWindowWidth / 2
layoutDocument.FloatingTop = cursorPosition.Y - floatingWindowHeight / 2

应该可以。

这效果不太好。 FloatingLeft 和 FloatingTop 似乎使用绝对显示器像素(我的屏幕有 1980x1080、1980x1200、1980x1200)值,但 Windows 和光标计算并使用每个屏幕宽度为 2400、高度为 1500 的虚拟尺寸。 这会导致 FloatingWindow 的位置发生滑动移动。

下一个想法是获取 LayoutFloatingWindowControl 并设置位置,但我不知道如何获取该对象。

对此有什么想法吗?

c# xaml avalondock
1个回答
0
投票

此时我有一些解决方法: 虚拟屏幕尺寸似乎取决于主屏幕的比例因子 (1.25)。这对于身高是准确的,但对于身高则不准确。 我使用这个因子,我从屏幕对象中获取该因子来计算物理像素位置,然后将其设置为 FloatingTop 和 FloatingLeft:

.
.
.
int floatingWindowWidth = 500;
int floatingWindowHeight = 300;

GetUnScaledCursorPosition(out int physicalX, out int physicalY);

layoutDocument.FloatingWidth = floatingWindowWidth;
layoutDocument.FloatingHeight = floatingWindowHeight;
layoutDocument.FloatingLeft = physicalX - floatingWindowWidth / 2
layoutDocument.FloatingTop = physicalY - floatingWindowHeight / 2
.
.
.
public void GetUnScaledCursorPosition(out int physicalX, out int physicalY)
{
    // Get current cursor position (logical pixels)
    var cursorPosition = Cursor.Position;

    // Get the screen that contains the cursor
    var currentScreen = Screen.FromPoint(cursorPosition);

    // Get DPI scaling factor for the current screen
    float dpiScaleFactor = DpiHelper.GetDpiScaleFactor(currentScreen);

    // Convert logical pixels to physical pixels
    physicalX = (int)(cursorPosition.X / dpiScaleFactor);
    physicalY = (int)(cursorPosition.Y / dpiScaleFactor);
}
© www.soinside.com 2019 - 2024. All rights reserved.