Как осуществить MinWidth & MinHeight в окне WPF где WindowStyle = “Ни один”?

Если Вы хотите поместить System.out.println ("что-нибудь"); к Вашему коду можно просто сделать следующим образом: Только запишите", тогда отметьте "" и нажмите Crtl-Space Up-Arrow и войдите (необходимо приземлиться на "sysout").

Вуаля, там это:)

9
задан Dave Clemmer 26 August 2011 в 16:44
поделиться

2 ответа

Для этого вам нужно обработать сообщение Windows, но это несложно.

Вам нужно обработать сообщение WM_WINDOWPOSCHANGING, для этого в WPF требуется немного шаблонного кода, вы ниже можно увидеть, что фактическая логика - это всего лишь две строки кода.

internal enum WM
{
   WINDOWPOSCHANGING = 0x0046,
}

[StructLayout(LayoutKind.Sequential)]
internal struct WINDOWPOS
{
   public IntPtr hwnd;
   public IntPtr hwndInsertAfter;
   public int x;
   public int y;
   public int cx;
   public int cy;
   public int flags;
}

private void Window_SourceInitialized(object sender, EventArgs ea)
{
   HwndSource hwndSource = (HwndSource)HwndSource.FromVisual((Window)sender);
   hwndSource.AddHook(DragHook);
}

private static IntPtr DragHook(IntPtr hwnd, int msg, IntPtr wParam, IntPtr lParam, ref bool handeled)
{
   switch ((WM)msg)
   {
      case WM.WINDOWPOSCHANGING:
      {
          WINDOWPOS pos = (WINDOWPOS)Marshal.PtrToStructure(lParam, typeof(WINDOWPOS));
          if ((pos.flags & (int)SWP.NOMOVE) != 0)
          {
              return IntPtr.Zero;
          }

          Window wnd = (Window)HwndSource.FromHwnd(hwnd).RootVisual;
          if (wnd == null)
          {
             return IntPtr.Zero;
          }

          bool changedPos = false;

          // ***********************
          // Here you check the values inside the pos structure
          // if you want to override them just change the pos
          // structure and set changedPos to true
          // ***********************

          // this is a simplified version that doesn't work in high-dpi settings
          // pos.cx and pos.cy are in "device pixels" and MinWidth and MinHeight 
          // are in "WPF pixels" (WPF pixels are always 1/96 of an inch - if your
          // system is configured correctly).
          if(pos.cx < MinWidth) { pos.cx = MinWidth; changedPos = true; }
          if(pos.cy < MinHeight) { pos.cy = MinHeight; changedPos = true; }


          // ***********************
          // end of "logic"
          // ***********************

          if (!changedPos)
          {
             return IntPtr.Zero;
          }

          Marshal.StructureToPtr(pos, lParam, true);
          handeled = true;
       }
       break;
   }

   return IntPtr.Zero;
}
11
ответ дан 4 December 2019 в 08:15
поделиться

Я не могу проверить это в данный момент, потому что я использую ноутбук Mac, но я считаю, что делал это раньше, обрабатывая событие SizeChanged и затем определяя, если MinWidth / Height нарушается, и если это так, просто установите для свойства Width / Height значение min.

0
ответ дан 4 December 2019 в 08:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: