Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF自定义窗口最大化问题_C#_Wpf_Xaml - Fatal编程技术网

C# WPF自定义窗口最大化问题

C# WPF自定义窗口最大化问题,c#,wpf,xaml,C#,Wpf,Xaml,我对WPF很陌生,正在尝试用Blend构建GUI,但我遇到了各种各样的问题 我希望我的成品看起来像这样: (红色只是图标的占位符) 以下是我目前获得的XAML: <Window x:Class="GUI.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xa

我对WPF很陌生,正在尝试用Blend构建GUI,但我遇到了各种各样的问题

我希望我的成品看起来像这样: (红色只是图标的占位符)

以下是我目前获得的XAML:

<Window x:Class="GUI.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:GUI"
        mc:Ignorable="d"
        Title="GUI" 
        Height="840" 
        Width="920"
        WindowStyle="none"
        ResizeMode="CanResizeWithGrip" 
        AllowsTransparency="true"
        MouseLeftButtonDown="Window_MouseLeftButtonDown"
        WindowStartupLocation="CenterScreen"
        Background="Transparent"
        MaxWidth="{Binding Source={x:Static SystemParameters.WorkArea}, Path=Width}"
        MaxHeight="{Binding Source={x:Static SystemParameters.WorkArea}, Path=Height}">
    <Border x:Name="shadow">
        <Grid x:Name="grid" Background="White">
            <Grid.RowDefinitions>
                <RowDefinition Height="20"/>
                <RowDefinition Height="100"/>
                <RowDefinition Height="2"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>

            <Border Grid.Row="0" Background="#F9F9F9" />
            <Border Grid.Row="1" Background="#F9F9F9" />
            <Border Grid.Row="2" Background="#E9E9E9" />


            <DockPanel Grid.Row="0" LastChildFill="False">
                <Button x:Name="btnClose"
                        DockPanel.Dock="Right"
                        VerticalAlignment="Center" 
                        Height="20" Width="20" 
                        Click="btnClose_Click"
                        Style="{DynamicResource CloseButton}">
                    <Path Data="m 357.0883 499.0572 12.62375 12.6275 5.31375 -5.31625 -12.62625 -12.62625 12.62625 -12.61875 -5.31375 -5.3125 -12.62375 12.62 -12.6325 -12.62 -5.30375 5.3125 12.6175 12.61875 -12.6175 12.62625 5.30375 5.31625 12.6325 -12.6275 z" Stretch="Uniform" Fill="#FFAAAAAA" Width="10" Margin="0,0,0,0" ></Path>
                </Button>
                <Button x:Name="btnMaximise"
                        DockPanel.Dock="Right"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        Height="20" Width="20"
                        Click="btnMaximise_Click"
                        Style="{DynamicResource TitleButton}">
                    <Path Data="M4.3685131,23.127279L4.3685131,47.283243 47.117023,47.283243 47.117023,23.127279z M0,10.684L53.755001,10.684 53.755001,51.668001 0,51.668001z M8.5679998,0L58.668022,0 64,0 64,5.6864691 64,45.317999 58.668022,45.317999 58.668022,5.6864691 8.5679998,5.6864691z"
                                        Stretch="Uniform" Fill="#FFAAAAAA" Width="10" Margin="0,0,0,0" ></Path>
                </Button>
                <Button x:Name="btnMinimise"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        DockPanel.Dock="Right"
                        Height="20" Width="20"
                        Click="btnMinimise_Click" 
                        VerticalContentAlignment="Bottom"
                        Style="{DynamicResource TitleButton}">
                    <Button.Content>
                        <Path Data="M0,20L53.333,20 53.333,8.888 0,8.888z"
                                            Stretch="Uniform" Fill="#FFAAAAAA" Width="10" Margin="0,0,0,5"></Path>
                    </Button.Content>
                </Button>
            </DockPanel>
        </Grid>
    </Border>
</Window>
现在它工作得很好,但我真的很难让它在窗户上有阴影的情况下工作。当我在窗口中添加10px边框并设置dropshadow时,我会在边框中而不是在窗口中获得大小调整图标:

我还必须修改StateChanged事件方法,以在最大化时隐藏边框:

private void MainWindow_OnStateChanged(object sender, EventArgs e)
{
    if (WindowState == WindowState.Maximized && !isMaximized)
    {
        // max
        WindowState = WindowState.Normal;
        isMaximized = true;

        normalBounds = RestoreBounds;

        Height = SystemParameters.WorkArea.Height;
        MaxHeight = Height;
        MinHeight = Height;
        Top = 0;
        Left = 0;
        Width = SystemParameters.WorkArea.Width;
        SetMovable(false);
        this.grid.Margin = new Thickness(0);
        this.BorderThickness = new Thickness(0);
    }
    else if (WindowState == WindowState.Maximized && isMaximized)
    {
        // min
        WindowState = WindowState.Normal;
        isMaximized = false;

        MaxHeight = Double.PositiveInfinity;
        MinHeight = 0;

        Top = normalBounds.Top;
        Left = normalBounds.Left;
        Width = normalBounds.Width;
        Height = normalBounds.Height;
        SetMovable(true);
        this.grid.Margin = new Thickness(10);
        this.BorderThickness = new Thickness(10);
    }
}
但当窗口捕捉到屏幕边缘时,这显然不起作用:

总而言之,我的问题是:

  • 调整抓取器位于边框中,而不是主窗口中
  • 我不知道当窗口捕捉到屏幕边缘时如何隐藏边框
  • 有没有简单的方法来解决这个问题?我觉得我必须为所有这些创建一个非常粗糙的修复程序,并认为实现这样的自定义窗口会容易得多


    提前感谢您的帮助。

    如果您将页面的高度和宽度属性设置为“自动”,该怎么办?对不起,在哪里?在主窗口XAML或Maximize事件中?如果将页面的高度和宽度属性设置为“自动”,该怎么办?对不起,在哪里?在主窗口XAML中还是在Maximize事件中?
    private void MainWindow_OnStateChanged(object sender, EventArgs e)
    {
        if (WindowState == WindowState.Maximized && !isMaximized)
        {
            // max
            WindowState = WindowState.Normal;
            isMaximized = true;
    
            normalBounds = RestoreBounds;
    
            Height = SystemParameters.WorkArea.Height;
            MaxHeight = Height;
            MinHeight = Height;
            Top = 0;
            Left = 0;
            Width = SystemParameters.WorkArea.Width;
            SetMovable(false);
            this.grid.Margin = new Thickness(0);
            this.BorderThickness = new Thickness(0);
        }
        else if (WindowState == WindowState.Maximized && isMaximized)
        {
            // min
            WindowState = WindowState.Normal;
            isMaximized = false;
    
            MaxHeight = Double.PositiveInfinity;
            MinHeight = 0;
    
            Top = normalBounds.Top;
            Left = normalBounds.Left;
            Width = normalBounds.Width;
            Height = normalBounds.Height;
            SetMovable(true);
            this.grid.Margin = new Thickness(10);
            this.BorderThickness = new Thickness(10);
        }
    }