gpt4 book ai didi

wpf - 为什么 WindowStartupLocation = CenterScreen 将我的窗口放置在屏幕中心以外的位置?

转载 作者:行者123 更新时间:2023-12-04 01:09:52 26 4
gpt4 key购买 nike

这是 Window 声明:

<Window
x:Class="Pse.ExperimentBase.SplashWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Style="{StaticResource _windowStyle}"
WindowStartupLocation="CenterScreen"
WindowStyle="None">

这是样式声明:
<Style
x:Key="_windowStyle"
TargetType="Window">
<Setter
Property="Width"
Value="{Binding Path=InitialWindowWidth}" />
<Setter
Property="Height"
Value="{Binding Path=InitialWindowHeight}" />
<Setter
Property="Icon"
Value="Resources/MyIcon.ico" />
<Setter
Property="Background"
Value="{StaticResource _fadedOrangeBrush}" />
<Setter
Property="FontSize"
Value="11" />
</Style>

讨论:

屏幕为 1280 X 1024。窗口大小(由 InitialWindowWidth、InitialWindowHeight 绑定(bind)确定)为 800 X 600。

当窗口打开时,它会出现 188、141(左上角)。这基本上是它应该在的“西北”。如果我计算真正的居中值,它应该是 240、212(左、上)。

线索?

它总是第一个出现问题的窗口。如果我打开同一窗口的第二个实例,它将显示在正确的位置。

另一个线索?

如果我在打开第一个实例之前创建了两个实例,则第二个窗口实例只会显示在正确的位置。

所以...
Window win1 = windowFactory.CreateSplashWindow();
win1.Show();
Window win2 = windowFactory.CreateSplashWindow();
win2.Show();
win1.Hide();

...偏移 win1 和 win2

但...
Window win1 = windowFactory.CreateSplashWindow();
Window win2 = windowFactory.CreateSplashWindow();
win1.Show();
win2.Show();
win1.Hide();

...偏移 win1 但显示 win2 死点。

所以我的问题是:

这里发生了什么???

编辑:

又是一条线索。如果我添加...
Width="800"
Height="600"

...对于我的 Window 声明,偏移问题消失了。不过,这对我来说不是一个解决方案,因为我需要将窗口大小作为存储在设置文件中的首选项。这就是为什么我的 Style 中有数据绑定(bind)。 (请注意,宽度和高度的数据绑定(bind)工作正常——所有窗口都显示为正确的大小)。

编辑#2:

我在 Debug模式下检查了宽度和高度,得出了这个有趣的结论:

如果我创建多个窗口实例但不打开任何窗口,则所有窗口实例的 Width 和 Height 属性都是“NaN”。

如果我然后只打开一个实例,所有窗口实例的宽度和高度属性突然变成有效数字,而不仅仅是我打开的窗口的宽度和高度。

这告诉我 WPF 推迟数据绑定(bind),直到在第一个窗口上调用 Show()。

--> 所以现在问题变成了:我可以在显示第一个窗口之前强制 WPF 进行数据绑定(bind)吗?

编辑#3:

我刚刚向 Microsoft 提交了关于此问题的错误报告。链接在这里:

https://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=477598

编辑#4:解决方法

对此还没有真正的解决方案,但我刚刚确认您可以使用虚拟窗口解决此问题。跟着这些步骤:
  • 创建一个名为“BlankWindow”的新 XPF 窗口(请参阅下面的 XAML)。
  • 创建一个 BlankWindow 实例以及您希望在屏幕上居中的窗口 (FirstWindow)。
  • 执行以下代码序列:

  • ...
    BlankWindow.Show()
    FirstWindow.Show()
    BlankWindow.Hide()

    我的虚拟窗口的 XAML 仅此而已:
    <Window
    x:Class="Pse.ExperimentBase.Windows.BlankWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="BlankWindow"
    Height="0"
    Width="0"
    WindowStyle="None">
    <Grid></Grid>
    </Window>

    在“FirstWindow”打开之前我没有看到明显的闪烁,所以我认为这是一个足够好的解决方法,直到 MS 开始修复错误。

    最佳答案

    你的WidthHeight绑定(bind)会碍事吗?如果不设置 WidthHeight到底,窗口是否出现在正确的位置?如果是这样,那与您设置上述绑定(bind)时的位置是否相同?

    如果这一切都是真的,那么听起来 WPF 在获取 Width 的值之前正在计算窗口的位置。和 Height从你的绑定(bind)。我不确定解决此问题的好方法 - 可能设置为 WidthHeight首先手动(在 XAML 或构造函数中),然后在显示绑定(bind)后设置绑定(bind)?

    关于wpf - 为什么 WindowStartupLocation = CenterScreen 将我的窗口放置在屏幕中心以外的位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1185652/

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