要还原的WPF最小化窗口设置

要还原的WPF最小化窗口设置,wpf,window,.net-4.5,restore,maximize,Wpf,Window,.net 4.5,Restore,Maximize,我在WPF窗口中得到了一些非常奇怪的行为,我可以用一个基本的应用程序重新创建它。当我从最大化状态最小化窗口,然后恢复窗口时,它不会返回最大化。我已经实现了一些代码来尝试并解决这个问题,但是窗口仍然返回到WindowState.Normal 关于这一点需要注意的一件重要事情是,只有在独立运行应用程序时才会发生这种情况。如果我在VisualStudio中以调试模式运行,一切都会按预期工作。而且,这种行为发生在多个盒子上,而不仅仅是我自己的盒子 使用以下代码复制的步骤: 双击WpfApplicatio

我在WPF窗口中得到了一些非常奇怪的行为,我可以用一个基本的应用程序重新创建它。当我从最大化状态最小化窗口,然后恢复窗口时,它不会返回最大化。我已经实现了一些代码来尝试并解决这个问题,但是窗口仍然返回到
WindowState.Normal

关于这一点需要注意的一件重要事情是,只有在独立运行应用程序时才会发生这种情况。如果我在VisualStudio中以调试模式运行,一切都会按预期工作。而且,这种行为发生在多个盒子上,而不仅仅是我自己的盒子

使用以下代码复制的步骤:

  • 双击WpfApplication1.exe
  • 确保应用程序最大化
  • 单击右上角的最小化按钮
  • 单击任务栏中的应用程序

    预期结果:应用程序窗口返回到最大化状态

    实际结果:应用程序窗口处于还原状态,具有
    WindowState
    =
    WindowState.Normal

  • 下面是演示窗口的XAML代码

    <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"
        Activated="MainWindow_OnActivated"
        StateChanged="MainWindow_OnStateChanged">
        <Grid>
    
        </Grid>
    </Window>
    
    在我的实际应用程序中,我将日志代码放在
    OnActivated
    函数和
    StateChanged
    函数中设置的
    WindowState
    前后。从最小化激活时,我得到以下信息:

    OnActivated 1  - _lastWindowState: Maximized
    OnStateChanged - _lastWindowState: Maximized
    OnActivated 2  - _lastWindowState: Maximized
    OnStateChanged - _lastWindowState: Normal
    
    最后,如果这有帮助,这是上次发生的StateChanged调用中的
    环境.StackTrace

    at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
       at System.Environment.get_StackTrace()
       at MapViewer.MainWindow.MainWindow_OnStateChanged(Object sender, EventArgs e) in c:\APP\MainWindow.xaml.cs:line 994
       at System.Windows.Window.OnStateChanged(EventArgs e)
       at System.Windows.Window.WmSizeChanged(IntPtr wParam)
       at System.Windows.Window.WindowFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.Run()
       at System.Windows.Application.RunDispatcher(Object ignore)
       at System.Windows.Application.RunInternal(Window window)
       at System.Windows.Application.Run(Window window)
       at System.Windows.Application.Run()
       at MapViewer.App.Main() in c:\Projects\APP\obj\x86\Debug\App.g.cs:line 0
    

    您是否有包含此代码的原因?似乎您试图实现的是WPF中的默认最大化/最小化行为,只要您具有ResizeMode=CanResize。真正的功能是,我有另一个应用程序向该应用程序发送消息以激活。当应用程序在最小化状态下激活自身时,它不会恢复窗口。我尝试了来自的解决方案,但它提供了相同的功能
    ResizeMode=CanResize
    没有帮助您是否尝试过该问题的第二种解决方案(直接访问OS API)?我已经单独使用了SW_RESTORE,并使用我的
    \u LastWindowsState
    过程将SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED。这两个应用似乎都不起作用。“…我有另一个应用程序向这个应用程序发送消息以激活…”:微软故意禁用一些旧的Win32 API窗口功能,主要是出于安全原因,以防止其他应用程序入侵其他应用程序的窗口等。WPF处理管道也不同。首选的方法是使用更新的更干净的API(例如WCF)进行应用程序间通信,并将窗口管理完全留给应用程序。另一个应用程序向你发送激活信号,你调用WPF窗口。。。你需要做什么
    at System.Environment.GetStackTrace(Exception e, Boolean needFileInfo)
       at System.Environment.get_StackTrace()
       at MapViewer.MainWindow.MainWindow_OnStateChanged(Object sender, EventArgs e) in c:\APP\MainWindow.xaml.cs:line 994
       at System.Windows.Window.OnStateChanged(EventArgs e)
       at System.Windows.Window.WmSizeChanged(IntPtr wParam)
       at System.Windows.Window.WindowFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at System.Windows.Interop.HwndSource.PublicHooksFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)
       at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.DefWndProcWrapper(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.CallWindowProc(IntPtr wndProc, IntPtr hWnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam)
       at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg)
       at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame)
       at System.Windows.Threading.Dispatcher.Run()
       at System.Windows.Application.RunDispatcher(Object ignore)
       at System.Windows.Application.RunInternal(Window window)
       at System.Windows.Application.Run(Window window)
       at System.Windows.Application.Run()
       at MapViewer.App.Main() in c:\Projects\APP\obj\x86\Debug\App.g.cs:line 0