5

シナリオ

次のシナリオがあります (サンプル アプリケーションに落とし込みました)。

  • WinForms UserControl ( UserControl1 ) をホストするウィンドウ ( MainWindow ) を持つ WPF アプリケーション。
    • コントロールはコード ビハインドで動的に追加されます。WindowsFormsHost
  • UserControl1には、フォームを開くボタンがあります ( Form1 )
    • を使用していますform1.Show(this)

問題は次のとおりです。

  • Form1.Ownerプロパティは null です。
    • 実際のアプリケーションでは、プロパティに関連するいくつかの作業が行われるため、.Ownerこの問題を無視することはできません。もちろん、理想的には、ここには依存関係がありません。
    • 実際のアプリケーションでは、このコードの WinForms 側を制御することはできません。私たちの WPF アプリケーションは、別のチームの WinForms コントロールをホストしています。
    • ノート:
      • 代わりに WinForms ホストを使用すると、.Ownerプロパティが正しく設定されます。
      • UserControl1は、他のすべての方法で正常にホストされます。実際のアプリケーションでは、他のすべてが正常に機能します。ユーザー コントロールによって開かたフォームに適切な所有者がいないだけです。

ここに問題がある理由は理解できますが、次の質問への答えが「はい」になることを願っています!

方程式の WPF 側を変更して、これを機能させるためにできることはありますか?

それができない場合、WinForms 側で何かできるでしょうか? (そこにいくつかの変更を実装できる可能性の範囲を超えているわけではありません...)

サンプルコード

これが私のサンプルアプリのコードです。まず WPF 側:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="700">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
        <Button Name="btnAdd" Click="btnAdd_Click" Content="Add Winform"/>

        <WindowsFormsHost Grid.Row="1" Name="host" ScrollViewer.CanContentScroll="False"/>
    </Grid>
</Window>
public partial class MainWindow : Window
{
    private WindowsFormsHost host;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btnAdd_Click(object sender, RoutedEventArgs e)
    {
        UserControl1 uc1 = new UserControl1();
        WindowsFormsHost.EnableWindowsFormsInterop();
        this.host.Child = uc1;

    }
}

そして今、WinForms側...

UserControl1は、ボタンとラベルが付いた単なるユーザー コントロールです。コードは次のとおりです。

public partial class UserControl1 : UserControl
    {
        public UserControl1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Form1 form1 = new Form1();
            form1.Show(this);
        }

        protected override void OnLoad(EventArgs e)
        {
            base.OnLoad(e);

            this.label1.Text = "this: " + this + Environment.NewLine + "parent: " + this.Parent + Environment.NewLine + "toplevelcontrol: " + this.TopLevelControl;
        }
    }

Form1は単なる空のフォームです。

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);

        MessageBox.Show(" this: " + this + " owner: " + this.Owner);
    }
}

Ownerメッセージ ボックスに表示されるTopLevelControlとラベルに表示される はnull、WPF でホストされている場合ですが、別の WinForms アプリケーションでホストされている場合は値を持ちます。

さらなる調査

.Ownerここでの問題は、それが型Formであり、WPF アプリケーションにこの型のインスタンスがないことだと思います。このシナリオでそのプロパティが持つ有効な値を想像するのは困難です。したがって、 Form1の `.Owner' プロパティにアクセスしているコードを変更する必要があるようです。

4

1 に答える 1

1
<Window
  xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration" 
>

<my:WindowsFormsHost  Name="MapHost" ScrollViewer.CanContentScroll="False"  SizeChanged="MapHost_SizeChanged" />

MapControl は System.Windows.Forms.Control を継承します

MapHost.Child = MapControl;
于 2012-12-11T20:29:32.047 に答える