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