Прозрачность окна в WPF против Winforms - PullRequest
3 голосов
/ 06 августа 2010

Почему я должен установить для свойства WindowStyle значение None в форме WPF, чтобы получить прозрачность, но в Winforms я могу сделать это в любой форме, сохранив границы, стандартные кнопки и т. Д.? Очевидно, что API поддерживает это, поэтому я не совсем понимаю, что особенного в WPF, что может сделать это проблемой.

Я предполагаю, что WPF перепрыгивает через некоторые обручи DirectX или OpenGL, в то время как Winforms просто устанавливают альфа для окна через API, но я мог бы быть далеко от базы.

1 Ответ

2 голосов
/ 06 августа 2010

Согласен, это жестко:

   private void VerifyConsistencyWithAllowsTransparency(WindowStyle style)
   {
       if (AllowsTransparency && style != WindowStyle.None)
       {
           throw new InvalidOperationException(SR.Get(SRID.MustUseWindowStyleNone));
       }
   }

WPF использует тот же механизм, что и Windows Forms, многослойные окна.Нет очевидных причин, по которым он не будет работать так же в WPF.Фрагмент кода, взятый из Window.cs, просто исключает его.Однако есть одна подсказка из свойства UsesPerPixelOpacity:

Когда вы включаете непрозрачность для каждого пикселя, система больше не рисует не-клиентскую область.Это связано с тем, что предполагаемая цель UsesPerPixelOpacity - показать непрямоугольный пользовательский интерфейс верхнего уровня, который работает в сценариях взаимодействия, и показать, что прямоугольная не-клиентская область побеждает эту цель.

«сценарии взаимодействия»,Я думаю.

...