0

我正在尝试将现有的 Winforms 项目迁移到 WPF 中。但是:我需要将一些用户控件保留为 WinForm 控件。

我已将 WinForms UserControl 添加到 WPF 窗口中。它由一个 RichTextBox 和一些按钮和标签组成。这被细分为各种进一步的用户控件。

当我将 UserControl 嵌入到 WPF 窗口中时,它会呈现 - 但没有一个按钮似乎做任何事情。当底层进程更新时,例如 RichTextBox,它不会显示内容。然而,当我在调试中检查文本框时,我可以看到内容(尽管我必须单击“base”才能看到它。)

[我发现的一个区别——尽管它可能不相关——是当这个控件在 WPF 上并且不工作时,Visual Studio 将对象显示为“密封”,但是当它在原始 Winforms 项目中完全工作时它确实不显示为密封。]

我添加了代码来更改标签中的文本 - 他们也坚决拒绝更新:如果我在调试模式下检查标签,我可以再次看到文本。

这个堆栈溢出问题可能会解决相同的问题: WindowsFormsHost Winform pdfviewer control problem

但答案对我来说没有多大意义:它提到了替换

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

但这不是我认识的一段代码:我正在使用一个带有代码的 xaml 文件,它被调用使用

System.Windows.Application app = new System.Windows.Application(); 
app.Run(new FormWPFApp());

(FormWPFApp 是我的 WPF 窗口名称)

这是 xaml 标头:-

<Window x:Class="ZedApp.FormWPFApp"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:Printers="clr-namespace:ZedApp.UserControls.Printers"
        xmlns:wf="clr-namespace:System.Windows.Forms;assembly=System.Windows.Forms"

        Title="Conversion version" Height="661" Width="1559" Loaded="Window_Loaded">

这是我用于两个 UserControls 的 xaml(它们都继承自同一个基类):-

<WindowsFormsHost Height="430" HorizontalAlignment="Left" Margin="192,32,0,0" Name="windowsFormsHostTicketPrinter" VerticalAlignment="Top" Width="324" Grid.Row="1" Grid.Column="1">
    <Printers:TicketPrinter x:Name="ticketPrinter">
    </Printers:TicketPrinter>
</WindowsFormsHost>
<WindowsFormsHost Height="430" HorizontalAlignment="Left" Margin="522,32,0,0" Name="windowsFormsHostJournalPrinter" VerticalAlignment="Top" Width="324" Grid.Row="1" Grid.Column="1">
    <Printers:JournalPrinter x:Name="journalPrinter">
    </Printers:JournalPrinter>
</WindowsFormsHost>

[我注意到的另一件事是,如果在 WPF 中的 WindowsFormsHost 下运行,清除其中一个窗口上的富文本框的方法开始踢出以下类型的错误 - “在窗口句柄之前,不能在控件上调用 Invoke 或 BeginInvoke被创造了。”

private void ClearRichTextBox(RichTextBox rtbToClear)
{
    if (rtbToClear.IsHandleCreated)
    {

        if (rtbToClear.InvokeRequired)
        {
            this.Invoke(new Action<RichTextBox>(ClearRichTextBox), new object[] {rtbToClear});
            return;
        }

        rtbToClear.Clear();
    }
}

]

这种行为的可能原因是什么?我需要做什么才能使用户控件中的元素正常工作?

4

1 回答 1

0

与 WinForms 的正确输入互操作需要主机和 WPF 输入系统之间的一些合作。SDK 中 Win32 和 WPF 之间的 消息循环主题很好地解释了这一点。在您的设置中,实现这一点的最简单方法是使用如下代码:

Window w = new Window1();
System.Windows.Forms.Integration.ElementHost.EnableModelessKeyboardInterop(w);
w.Show();

ElementHost.EnableModelessKeyboardInterop() 实质上是向 WinForms 应用程序对象(通常运行消息循环)注册一个输入挂钩并调用 ComponentDispatcher.RaiseThreadMessage()。

于 2012-05-29T06:11:43.030 回答