WPF 应用程序在使用 SingleBorderWindow 和 WindowChrome 时超出全屏显示器宽度

问题描述 投票:0回答:1

我想创建一个带有自定义工具栏/控制按钮的 WPF 应用程序。大多数来源指示您使用 WindowStyle.None 并使用 WindowChrome。这确实删除了默认的 Windows 工具栏,它允许我调整应用程序的大小并双击以从 WindowState.Normal 切换到 WindowState.Maximized 并返回。

此设置唯一遗漏的是切换 WindowState 和最小化应用程序时的默认 Windows 动画。经过一番研究,我发现 WindowStyle.SingleBorderWindow (和 WindowStyle.ThreeDBorderWindow)确实包含这些动画。

现在唯一的问题是,当在多显示器设置上最大化 WindowState 时,应用程序会在右侧溢出屏幕一个像素左右。

我尝试在 WindowState 切换到最大化时将 WindowStyle 切换为 None,但这似乎不起作用,应用程序仍然溢出到我的右侧显示器中。

这是 XAML:

<Window x:Class="WpfTest.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfTest"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800"
        WindowStyle="SingleBorderWindow"
        StateChanged="MainWindow_OnStateChanged">

</Window>

这是 C#:

public MainWindow()
    {
        InitializeComponent();
        WindowChrome chrome = new();
        WindowChrome.SetWindowChrome(this, chrome);
    }

    private void MainWindow_OnStateChanged(object? sender, EventArgs e)
    {
        if (this.WindowState == WindowState.Maximized)
        {
            this.WindowStyle = WindowStyle.None;
        }
        else
        {
            this.WindowStyle = WindowStyle.SingleBorderWindow;
        }
    }

所以基本上我必须在没有动画的大小合适的应用程序和带有动画但不太适合屏幕的应用程序之间进行选择。

c# wpf xaml frontend
1个回答
0
投票

我以前也遇到过这个问题。尝试按以下方式包装您的网格(或您正在使用的任何主要控件)信息边框:

<Border>

    <!--  Setting border style triggers to prevent the edges Window out of the screen  -->
    <Border.Style>

        <Style TargetType="{x:Type Border}">

            <Style.Triggers>

                <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
                             Value="Maximized">

                    <Setter Property="Margin"
                            Value="6" />

                </DataTrigger>

                <DataTrigger Binding="{Binding WindowState, RelativeSource={RelativeSource AncestorType=Window}}"
                             Value="Normal">

                    <Setter Property="Margin"
                            Value="0" />

                </DataTrigger>

            </Style.Triggers>

        </Style>

    </Border.Style>

    <!-- Your main control -->
    <Grid>
    
    </Grid>

</Border>

它也适用于我以下的 WIndowsChrome:

<WindowChrome.WindowChrome>

    <WindowChrome CaptionHeight="1"
                  CornerRadius="0"
                  GlassFrameThickness="1"
                  ResizeBorderThickness="4" />

</WindowChrome.WindowChrome>

我也找到了解决方案here。 请告诉我它是否适合您

© www.soinside.com 2019 - 2024. All rights reserved.