【问题标题】:Maximizing own window doesn't cover entire screen最大化自己的窗口不会覆盖整个屏幕
【发布时间】:2018-07-10 07:44:02
【问题描述】:

这是我最大化自己的窗口的代码:

private void maximizeWindow(object sender, RoutedEventArgs e)
{
    this.Width = SystemParameters.WorkArea.Width;
    this.Height = SystemParameters.WorkArea.Height; 
}

这就是代码的行为方式:

no Maximizing

with maximizing

所以问题是,当我最大化窗口时,屏幕会最大化,但窗口不在中心位置,我总是必须将屏幕左上角移动才能看到整个屏幕。

【问题讨论】:

    标签: c# wpf maximize-window


    【解决方案1】:

    如果你想最大化一个窗口,你应该将WindowState属性设置为WindowState.Maximized

    private void maximizeWindow(object sender, RoutedEventArgs e)
    {
        WindowState = WindowState.Maximized;
    }
    

    【讨论】:

    • 问题是我只想最大化工作区域而不是整个窗口屏幕
    • “工作区”和窗口有什么区别,为什么还要设置this.Width
    • 工作区域是您“工作”的区域。这意味着您可以看到窗口底部栏。否则,如果您使用最大化整个窗口屏幕。
    • @plshm 不,最大化的窗口不会覆盖 Windows 任务栏。
    • @mm8 它对我有影响,当整个屏幕被覆盖时,我看不到下面的 Windows 任务栏。
    【解决方案2】:

    答案 2.0

    由于知道您想让窗口最大化而不覆盖任务栏,我建议您使用WindowChrome

    <Window x:Class="MejirdrituTeWarqoudear.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Width="540" Height="360">
        <WindowChrome.WindowChrome>
            <WindowChrome CornerRadius="0" />
        </WindowChrome.WindowChrome>
        <Window.Template>
            <ControlTemplate TargetType="Window">
                <Border Name="Bd">
                    <AdornerDecorator>
                        <Border Background="{TemplateBinding Background}"
                                BorderThickness="{TemplateBinding BorderThickness}"
                                BorderBrush="{TemplateBinding BorderBrush}">
                            <ContentPresenter />
                        </Border>
                    </AdornerDecorator>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="WindowState" Value="Maximized">
                        <Setter TargetName="Bd" Property="Padding" Value="8" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Window.Template>
        <Border BorderThickness="8" BorderBrush="Teal" />
    </Window>
    

    通过将WindowState 设置为Maximized,窗口将像普通窗口一样最大化而不覆盖任务栏。

    1. 您可能会发现我为Window 添加了Template。我编写模板以在窗口最大化时添加额外的填充。如果你去掉它,你会发现窗口最大化时会失去一些边缘。无论您的 DPI 值是多少,该值都是 8
    2. WindowChrome 帮助您将客户区 UI 扩展到非客户区。所以你不需要再次设置窗口透明。删除 AllowsTransparency="True"WindowStyle="None" 属性。

    答案 1.0

    如果你只关心主屏幕:

    // If you only cover the primary screen.
    Left = 0.0;
    Top = 0.0;
    Width = SystemParameters.PrimaryScreenWidth;
    Height = SystemParameters.PrimaryScreenHeight;
    

    如果您关心多个屏幕:

    // If you have more than one screen monitors, The code below covers the whole screen area.
    Left = SystemParameters.VirtualScreenLeft;
    Top = SystemParameters.VirtualScreenTop;
    Width = SystemParameters.VirtualScreenWidth;
    Height = SystemParameters.VirtualScreenHeight;
    

    【讨论】:

    • 问题是我的窗口任务栏在最大化时消失了。
    • @plshm,那么我可以使用WindowChrome 将我的答案更改为另一个答案吗?
    • @plshm,我使用WindowChrome 更新了我的答案。希望对你有帮助。
    【解决方案3】:

    您还需要设置 WPF 窗口的位置。添加以下内容以及您的代码:

    this.Left = 0;
    this.Top = 0;
    

    【讨论】:

    • 我的 MainWindow 中没有名为 Location 的属性?
    • @plshm 抱歉,我的 winforms 代码,请尝试更新
    • 。你有一个WindowState 属性,你不需要设置位置/大小。此外,这是 错误 MVVM 方法:您应该有一个 command 来更改绑定到 WindowState 窗口属性的 VM 中的属性(可能通过 @987654324 @)。
    • @AdrianoRepetti,将视图模型纳入特定于视图的交互是错误的
    • @ASh 虽然确实应该将 view 东西(例如这个或突出显示的东西)保留在视图中,但仍然 错误为这些事情使用事件。视图可能包含它的模型,但这并不能作为避免它的借口(当视图中的逻辑不止一个标志时尤其如此,那么没有理由教一种次优的方法来取消学习稍后,也许反过来)。例如:最大化窗口可能以按钮和菜单项的形式出现,当窗口已经最大化和/或固定大小时应该禁用它。
    猜你喜欢
    • 2014-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多