WPF минимизировал настройки окна для восстановления
Я получаю очень странное поведение с окном WPF, которое я могу воссоздать с помощью основного приложения. Когда я сверну свое окно из развернутого состояния, то восстановлю окно, оно не вернется в развернутом виде. Я реализовал код, чтобы попытаться противостоять этому, но окно все еще возвращается к WindowState.Normal
,
Важно отметить, что это происходит только тогда, когда я запускаю приложение автономно. Если я запускаю в режиме отладки в Visual Studio, все работает как положено. Кроме того, это поведение происходит на нескольких ящиках, а не только на моем.
Шаги для воспроизведения с кодом ниже:
- дважды щелкните 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>
и код позади:
public partial class MainWindow : Window
{
private WindowState _lastWindowState;
private bool _activating;
public MainWindow()
{
InitializeComponent();
_lastWindowState = WindowState.Normal;
}
private void MainWindow_OnActivated(object sender, EventArgs e)
{
if (WindowState == WindowState.Minimized)
{
WindowState = _lastWindowState;
}
}
private void MainWindow_OnStateChanged(object sender, EventArgs e)
{
if (WindowState != WindowState.Minimized)
{
_lastWindowState = WindowState;
}
}
}
В моем реальном приложении я поместил код регистрации до и после WindowState
установить в OnActivated
функция и в StateChanged
функция. При активации из свернутого я получаю следующее:
OnActivated 1 - _lastWindowState: Maximized
OnStateChanged - _lastWindowState: Maximized
OnActivated 2 - _lastWindowState: Maximized
OnStateChanged - _lastWindowState: Normal
Наконец, если это помогает, это Environment.StackTrace
в последнем вызове StateChanged, который происходит:
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