0

既存の Winforms プロジェクトを WPF に移行しようとしています。ただし、WinForm コントロールとして残す必要があるユーザー コントロールがいくつかあります。

WinForms UserControl を WPF ウィンドウに追加しました。これは、RichTextBox といくつかのボタンとラベルで構成されています。これは、さらにさまざまなユーザー コントロールにサブクラス化されます。

UserControl を WPF ウィンドウに埋め込むとレンダリングされますが、どのボタンも何もしていないように見えます。基になるプロセスが更新されると、たとえば RichTextBox はコンテンツを表示しません。それでも、デバッグでテキストボックスを調べると、コンテンツを見ることができます (ただし、これを表示するには「ベース」をクリックする必要があります)。

[私が見つけた違いの 1 つは、関連性はないかもしれませんが、このコントロールが WPF 上にあり、動作していない Visual Studio ではオブジェクトが「封印されている」と表示されますが、元の Winforms プロジェクトでは完全に動作しているときに表示されることです。封印されていません。]

ラベルのテキストを変更するコードを追加しましたが、更新も固く拒否しています。デバッグ モードでラベルを調べると、テキストが表示されます。

このスタック オーバーフローの質問は、同じ問題に対処している可能性があります: WindowsFormsHost Winform pdfviewer コントロールの問題

しかし、答えは私にはあまり意味がありませんでした:

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">

2 つの 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>

[私が気付いたもう 1 つのことは、ウィンドウの 1 つでリッチ テキスト ボックスをクリアするメソッドが、WPF の WindowsFormsHost の下で実行された場合、次のタイプのエラーを追い出し始めることです。作成されました。」

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 に答える