如何将 Windows 窗体面板添加到 Wpf TabControl

MyD*_*ons 1 c# wpf

我被分配了一项任务,但我很困惑。我在 WPF 应用程序中调用 API,它返回一个 Windows 窗体面板。我的工作是在 TabControl 中显示面板

目前,我正在 WPF 项目的 CodeBehind 中执行代码,如下所示

public MainWindow()
{
    InitializeComponent();
    var panel = GetPanelFromApi();        

    this.MyTabControl.Items.Add(panel);//fail
}
Run Code Online (Sandbox Code Playgroud)

程序运行,没有崩溃,但面板没有显示在我的 TabControl 中,但是,TabControl 确实呈现为好像有 1 个项目(尽管面板的visible属性设置为 true,但可能它只是不可见)!

如果我将代码更新为

public MainWindow()
{
    InitializeComponent();
    TextBlock tb = new TextBlock();
    tb.Text = "Test";

    this.MyTabControl.Items.Add(tb);//yipee
}
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作(我看到TextBlock控件),所以问题是由于 Wpf 不喜欢面板......我不知道如何修复它或我应该看什么。

XAML

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
          <TabControl x:Name="MyTabControl"></TabControl>        
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

Roh*_*ash 5

要添加 Windows 窗体控件,您需要使用WindowsFormHost,这就是添加它的方法 -

    System.Windows.Forms.Integration.WindowsFormsHost host1 =
        new System.Windows.Forms.Integration.WindowsFormsHost();

    System.Windows.Forms.Panel panel =
        new System.Windows.Forms.Panel()
        {
            BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle};
            host1.Child = panel;

            ((this.MyTabControl.Items[0] as TabItem).Content as Grid).Children.Add(host1);
Run Code Online (Sandbox Code Playgroud)

另外,如果您使用 TabControls 并且不使用 TabItems 作为其子项,则使用 TabControl 是没有用的(而是可以直接使用 Grid)。但要添加 TabItems,您应该编写 XAML,如下所示:

    <TabControl x:Name="MyTabControl" >
        <TabItem Header="TabItem 1">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
        <TabItem Header="TabItem 2">
            <Grid Background="#FFE5E5E5"/>
        </TabItem>
    </TabControl>
Run Code Online (Sandbox Code Playgroud)