преобразовать текстовое поле wpf в iwin32window (winform) - PullRequest
0 голосов
/ 20 августа 2010

Как следует из названия, я хочу преобразовать System.Windows.Controls.Textbox в IWin32Window. Я прочитал Как использовать FolderBrowserDialog из приложения WPF но он описывает только то, как получить дескриптор winform, а не управлять им.

Спасибо

1 Ответ

1 голос
/ 20 августа 2010

WPF не использует дескрипторы Win32 для отдельных элементов управления, таких как TextBox, только для самого окна. Другими словами, с точки зрения Win32 весь объект окна WPF представляет собой одно окно с одним дескриптором.

Из-за этого IWin32Window не имеет смысла возвращать «фактический» Win32 дескриптор WPF TextBox: WPF TextBox просто не имеет дескрипторов Win32. Таким образом, вам придется вернуть дескриптор Win32 какого-либо другого объекта.

Как это сделать, зависит от того, для чего вы будете использовать IWin32Window. Существует несколько возможностей для создания окна Win32, соответствующего вашему TextBox:

  1. Вы можете создать прозрачное окно Win32, которое перекрывает TextBox (полезно для сценариев проверки на удар или перерисовки)
  2. Вы можете создать окно нулевого размера с центром в TextBox (полезно для сценариев начального местоположения и владения)
  3. Вы можете разместить TextBox в ElementHost, а не в окне WPF (полезно, если вы хотите, чтобы TextBox подходил для других компонентов Win32, таких как старое приложение MFC)
  4. Вы можете разместить TextBox в ElementHost внутри WindowsFormsHost (полезно, если вам нужно окно Win32 вокруг TextBox, но все еще требуется макет WPF

Примечания о решениях "дополнительного окна" (1 и 2)

Чтобы создать окно Win32, которое перекрывает TextBox (прозрачный или нулевого размера), вы должны использовать традиционные методы Win32 или WinForms.

Поскольку TextBox может перемещаться по экрану, вам необходимо перемещать окно Win32 всякий раз, когда TextBox перемещается. Это можно сделать в событии OnRendering с помощью textBox.TransformToAncestor (window), а затем преобразовать в координаты устройства с помощью PresentationSource.TransformToDevice.

Замечания по решениям ElementHost (3 и 4)

Это так же просто, как обернуть ElementHost вокруг TextBox в вашем XAML, так что:

<Grid>
  ...
  <TextBox ...>
</Grid>

может стать:

<Grid>
  ...
  <WindowsFormsHost>
    <ElementHost>
      <TextBox ...>
    </ElementHost>
  </WindowsFormsHost>
</Grid>

Это также можно сделать в коде, удалив TextBox из его родительского элемента, добавив его во вновь созданный ElementHost, а затем добавив ElementHost во вновь созданный WindowsFormsHost и добавив WindowsFormsHost обратно в родительский.

Обратите внимание, что стили и свойства WPF (включая DataContext, свойства TextElement и т. Д.) Не распространяются вниз через ElementHost, даже если они заключены в WindowsFormsHost, поэтому нужные параметры и ресурсы необходимо распространять вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...