WPF минимизировал настройки окна для восстановления

Я получаю очень странное поведение с окном WPF, которое я могу воссоздать с помощью основного приложения. Когда я сверну свое окно из развернутого состояния, то восстановлю окно, оно не вернется в развернутом виде. Я реализовал код, чтобы попытаться противостоять этому, но окно все еще возвращается к WindowState.Normal,

Важно отметить, что это происходит только тогда, когда я запускаю приложение автономно. Если я запускаю в режиме отладки в Visual Studio, все работает как положено. Кроме того, это поведение происходит на нескольких ящиках, а не только на моем.

Шаги для воспроизведения с кодом ниже:

  1. дважды щелкните WpfApplication1.exe
  2. убедитесь, что приложение максимально
  3. нажмите кнопку сворачивания в правом верхнем углу
  4. щелкните приложение на панели задач

    Ожидаемый результат: окно приложения возвращается в развернутое состояние

    Фактический результат: окно приложения находится в восстановленном состоянии, с 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

0 ответов

Другие вопросы по тегам