【问题标题】:How to set the location of a child window but not in the center of the owner window in WPF [SOLVED!]如何在 WPF 中设置子窗口的位置但不在所有者窗口的中心 [已解决!]
【发布时间】:2021-09-04 21:55:31
【问题描述】:

好的,我正在开发一个骰子游戏,我有游戏窗口和一个消息窗口,当我需要一个对话框时会打开。我发现如何使用 WindowStartupLocation="CenterOwner" 使消息窗口出现在其所有者的中心,问题是它隐藏了游戏窗口中显示的骰子以及一些消息,例如“恭喜你有一个系列!你赢了2500 点,但你的回合到此结束”我真的希望玩家能够在点击“结束你的回合”对话框按钮之前看到他的幸运和非常罕见的系列,这将为下一个玩家重置骰子显示。

我的问题是,有没有办法将子窗口的位置设置为比它的所有者中心高一点而不用硬编码?我觉得如果在我的游戏窗口设置为 CenterScreen 时通过为其 Top 和 Left 属性赋值来对其进行硬编码,游戏窗口内的消息位置将根据用户的屏幕而改变。

由于我找到了一种方法来重新定位我的“主页”窗口(我不知道如何用英文称呼它......)因为它的高度调整了,我希望有一种方法可以对我的消息做类似的事情窗口......问题是,这个没有调整大小,所以我不能使用我找到的方法......不过,这是我的“主页”窗口使用的方法,也许它会帮助想出一个想法?

protected override void OnRenderSizeChanged(SizeChangedInfo sizeInfo)
        {
            base.OnRenderSizeChanged(sizeInfo);

            this.Top += (sizeInfo.PreviousSize.Height - sizeInfo.NewSize.Height) / 2;
        }

【问题讨论】:

    标签: c# wpf location


    【解决方案1】:

    我通常使用这样的逻辑,通过基于主应用程序窗口的数学计算,使我的消息对话框在屏幕上显示得比中心高一点。逻辑有点粗略,但对我有用。

    我能够获取这些坐标并将它们输入到显示对话框的函数中。如果您无法以这种方式控制对话框,则可以在对话框的 Loaded 事件处理程序中使用类似这样的逻辑

    var win  = Application.Current.MainWindow;                     
    var left = win.Left + Math.Max(win.ActualWidth  / 2 - 100, 0);
    var top  = win.Top + Math.Max(win.ActualHeight / 4 - 50,  0);
    var loc  = WindowStartupLocation.Manual;
    

    【讨论】:

    • 谢谢乔!我没有完全按照你的建议做,但你给我指路了!这是我想出的:private void Window_Loaded(object sender, RoutedEventArgs e) { this.Top = Owner.Top + (Owner.ActualHeight/4 - this.ActualHeight/2); this.Left = Owner.Left + (Owner.ActualWidth/2 - this.ActualWidth/2); } 因为我的消息窗口将游戏窗口设置为它的所有者,所以我可以检索我需要的大小和位置信息,以便根据游戏窗口的位置放置它,即使玩家移动它! :D
    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 2011-02-05
    • 2013-08-20
    • 1970-01-01
    • 2014-10-12
    • 2013-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多