在我的 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 并设置位置,但我不知道如何获取该对象。
对此有什么想法吗?
此时我有一些解决方法: 虚拟屏幕尺寸似乎取决于主屏幕的比例因子 (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);
}