From 8ec95d63f590af55d672332cab11ea00a839b913 Mon Sep 17 00:00:00 2001 From: zqm Date: Tue, 4 Nov 2025 11:02:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0Area=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=E9=9C=80=E6=B1=82=EF=BC=9A=E5=88=9D=E5=A7=8B?= =?UTF-8?q?=E4=BD=8D=E7=BD=AE=E5=B1=85=E4=B8=AD=E3=80=81=E6=9C=80=E5=A4=A7?= =?UTF-8?q?=E5=8C=96=E8=BF=98=E5=8E=9F=E3=80=81=E8=BE=B9=E7=95=8C=E9=99=90?= =?UTF-8?q?=E5=88=B6=E3=80=81=E5=8D=95Panel=E6=97=A0=E6=A0=87=E9=A2=98?= =?UTF-8?q?=E6=A0=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Windows/Robot/Web/src/DockLayout/Area.vue | 40 ++++++++++++++++--- .../Robot/Web/src/DockLayout/DockLayout.vue | 2 +- 2 files changed, 35 insertions(+), 7 deletions(-) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue index 77462f6..f2a6ed5 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/Area.vue @@ -85,6 +85,8 @@ const originalPosition = ref({ left: props.left, top: props.top }) +// 保存最大化前的位置和大小,用于还原 +const maximizedFromPosition = ref(null) // 拖拽相关状态 const isDragging = ref(false) @@ -167,13 +169,13 @@ const onDragMove = (e) => { let newLeft = areaStartPos.value.x + deltaX let newTop = areaStartPos.value.y + deltaY - // 如果有父容器引用,应用边界限制 + // 确保不超出父容器边界 if (parentContainer.value) { const parentRect = parentContainer.value.getBoundingClientRect() const areaWidth = originalPosition.value.width const areaHeight = originalPosition.value.height - // 确保不超出父容器边界 + // 严格边界检查,确保元素完全在父容器内 newLeft = Math.max(0, Math.min(newLeft, parentRect.width - areaWidth)) newTop = Math.max(0, Math.min(newTop, parentRect.height - areaHeight)) } @@ -197,15 +199,22 @@ const onDragEnd = () => { const onToggleMaximize = () => { const next = isMaximized.value ? '正常' : '最大化' - // 如果是从正常状态切换到最大化状态,保存当前位置信息 if (!isMaximized.value) { - // 保存当前位置和大小,用于还原 - originalPosition.value = { + // 切换到最大化状态前,保存当前位置和大小 + maximizedFromPosition.value = { width: originalPosition.value.width, height: originalPosition.value.height, left: originalPosition.value.left, top: originalPosition.value.top } + } else if (maximizedFromPosition.value) { + // 从最大化状态还原时,恢复到保存的位置和大小 + originalPosition.value = { ...maximizedFromPosition.value } + // 通知父组件位置变化 + emit('update:position', { + left: originalPosition.value.left, + top: originalPosition.value.top + }) } localState.value = next @@ -214,9 +223,28 @@ const onToggleMaximize = () => { const onClose = () => emit('close') -// 组件挂载后获取父容器引用 +// 组件挂载后获取父容器引用并初始化位置 onMounted(() => { parentContainer.value = document.querySelector('.dock-layout') || window + + // 如果没有指定left或top,自动居中定位 + if (originalPosition.value.left === undefined || originalPosition.value.top === undefined) { + if (parentContainer.value && parentContainer.value !== window) { + const parentRect = parentContainer.value.getBoundingClientRect() + const areaWidth = originalPosition.value.width + const areaHeight = originalPosition.value.height + + // 计算居中位置 + originalPosition.value.left = Math.floor((parentRect.width - areaWidth) / 2) + originalPosition.value.top = Math.floor((parentRect.height - areaHeight) / 2) + + // 通知父组件位置变化 + emit('update:position', { + left: originalPosition.value.left, + top: originalPosition.value.top + }) + } + } }) diff --git a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue index cc8ef49..0024de7 100644 --- a/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue +++ b/AutoRobot/Windows/Robot/Web/src/DockLayout/DockLayout.vue @@ -7,7 +7,7 @@ :id="area.id" :title="area.title" v-model:WindowState="area.WindowState" - :showTitleBar="area.showTitleBar" + :showTitleBar="area.panels.length !== 1" :width="area.width" :height="area.height" :left="area.WindowState !== '最大化' ? area.x : undefined"