2

我正在尝试设置一个 WPF 窗口。

  • 窗口应始终处于最大化状态
  • 窗口无法移动或调整大小
  • 它应该包含最小化和关闭按钮,但不包含最大化按钮

我尝试了以下 XAML 代码

<Window x:Class="BasicImagingStandAlone"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:myUserControl="clr-namespace:WpfUserControlLibrary;assembly=WpfUserControlLibrary"
    Title="BasicImagingStandAlone" Icon="desktopicon.png" MinWidth="600" MinHeight="350" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    Height="600" Width="1200" WindowState="Maximized" WindowStyle="None"  ResizeMode="NoResize">
</Window>

xaml 的输出是一个处于最大化状态的窗口,不能移动或调整大小,但没有按钮。我怎样才能一次满足所有要求?

4

3 回答 3

6

这个问题差不多有2年了,但以防万一有人有同样的要求。

在 WPF 中,您可以使用帮助程序类HwndSource挂钩到窗口过程,然后可以使用它来处理窗口消息。

所以在 XAML 中设置WindowState="Maximized",ResizeMode="CanMinimize"和覆盖SourceInitialized:

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525"
    WindowState="Maximized" ResizeMode="CanMinimize" SourceInitialized="MainWindow_SourceInitialized">

以及代码隐藏(对此SO问题中答案的修改):

private void MainWindow_SourceInitialized(object sender, EventArgs e)
{
    WindowInteropHelper helper = new WindowInteropHelper(this);
    HwndSource source = HwndSource.FromHwnd(helper.Handle);
    source.AddHook(WndProc);
}

const int WM_SYSCOMMAND = 0x0112;
const int SC_MOVE = 0xF010;
const int SC_RESTORE = 0xF120;

private IntPtr WndProc(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handled)
{
    switch (msg)
    {
        case WM_SYSCOMMAND:
            int command = wParam.ToInt32() & 0xfff0;
            if (command == SC_MOVE)
            {
                // prevent user from moving the window
                handled = true;
            }
            else if (command == SC_RESTORE && WindowState == WindowState.Maximized)
            {
                // prevent user from restoring the window while it is maximized
                // (but allow restoring when it is minimized)
                handled = true;
            }
            break;
        default:
            break;
    }
    return IntPtr.Zero;
}

不要忘记包括:using System.Windows.Interop;

这应该满足 OP 的 3 个要求:

  • 最大化状态的窗口
  • 无法移动或调整窗口大小(包括通过拖动或双击标题栏)
  • 窗口的最小化和关闭按钮被启用,但恢复/最大化按钮被禁用
于 2015-05-14T09:12:54.097 回答
2

我找不到 XAML 唯一的方法。但是这段代码会帮助你

显示关闭和最小化按钮

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        ResizeMode="CanMinimize" WindowState="Maximized"
        Title="MainWindow" Height="350" Width="425">
    <Grid>

    </Grid>
</Window>

如果你双击窗口标题栏,它会调整到正常大小,以避免这种使用下面的代码。

public MainWindow()
{
    InitializeComponent();
    this.SizeChanged += MainWindow_SizeChanged;
}

private void MainWindow_SizeChanged(object sender, SizeChangedEventArgs e)
{
    if (WindowState == System.Windows.WindowState.Normal)
    {
        WindowState = System.Windows.WindowState.Maximized;
    }
}

希望能帮助到你 :)

于 2013-08-30T05:33:46.363 回答
0

为了触摸窗口的标题栏,您必须按照此答案中的说明导入 user32 API:

禁用最小化按钮,但保留交叉和最大化按钮 - WPF,C#

您也可以将 ResizeMode 设置为 CanMinimize。这将禁用最大化按钮。但是为了隐藏它,您将不得不使用如上所述的 user32 api

于 2013-08-30T05:28:51.737 回答