WindowsFormsHost Winform проблема управления pdfviewer - PullRequest
0 голосов
/ 08 января 2010

У меня есть wpf Usercontrol, внутри я использую Winforms pdfviewer для отображения файлов PDF. Также у меня есть несколько текстовых полей для ввода деталей документа. наконец, всплывающее окно, отображающее этот пользовательский элемент управления. Проблема в том, что когда я пытаюсь что-то напечатать в текстовых полях, происходит ntn. Когда я щелкаю правой кнопкой мыши на текстовом поле, я вижу контекстное меню с опциями вырезания, копирования и вставки. Немного погуглив, я нашел что-то вроде ниже, Forms.Integration.WindowsFormsHost.EnableWindowsFormsInterop (), я поместил эту строку в загруженное событие, но это не работает. Может ли кто-либо сталкивался с подобной проблемой и есть какие-либо решения. Благодарю. Rey

1 Ответ

1 голос
/ 12 января 2010

Я столкнулся с этой проблемой некоторое время назад. Насколько я помню, это была ошибка, связанная с циклом сообщений WPF верхнего уровня, который плохо воспроизводился с циклом сообщений WinForms.

Решением, которое я использовал, было изменение моего внешнего слоя с окна WPF на форму WinForms. Другими словами, я заменил

new Window { Content = CreateContent(), Title = title }.Show();

с

new ElementHostForm(CreateContent(), title).Show();

используя такой класс:

class ElementHostForm : System.Windows.Forms.Form
{
  ElementHost _host;

  public WinFormsWindow(UIElement content, string title)
  {
    _host = new ElementHost { Child = content };
    Controls.Add(host);

    content.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
    if(content.DesiredSize.Width > 100 && content.DesiredSize.Height > 100)
      ClientSize = _host.Size =
        new Size((int)content.DesiredSize.Width, (int)content.DesiredSize.Height));

    content.ClearValue(FrameworkElement.WidthProperty);
    content.ClearValue(FrameworkElement.HeightProperty);

    Title = title;
  }

  protected override void OnResize(EventArgs e)
  {
    if(!ClientSize.IsEmpty) _host.Size = ClientSize;
    base.OnResize(e);
  }
}

Это обошло проблему, позволив WinForms иметь самый внешний цикл сообщений.

Это изменение было очень легким для меня, потому что у меня уже был мой контент верхнего уровня в отдельном UserControl (не в Window). Если ваш контент верхнего уровня является окном, вам может потребоваться рефакторинг.

...