在Panel控件中添加新的窗体(C#,winform开发)

开始是想到的设置思路很简单,主窗体(如上图),右边放置一个Panel控件.

然后根据单击的按钮将子窗体显示在Panel控件上.

在按钮的单击事件中加入下面的代码:

private void button1_Click(object sender, EventArgs e)
{

    ChildForm child = new ChildForm();
    this.panel1.Controls.Add(child);
    child.Show();
}

运行程序

显示“不能将顶级控件添加到一个控件上”出现“不能将顶级控件添加到一个控件上”错误怎么处理?

在代码中加入
                child.TopLevel = false;

OK.

新问题又出现了.我们不希望子窗体的标题和边筐也显示在父窗体中,再添加如下代码.


              child.FormBorderStyle = FormBorderStyle.None;

现在的感觉是不是舒服多了.

但是还隐藏着一个新问题.怎样动态设置子窗体的Size、Location等呢?

我希望在调整父窗体大小时,Panel1      中子窗体的大小也跟随动态自动调整 .

需要加入下面的事件

private      void      panel1_Resize(object      sender,      System.EventArgs      e)   
     {   
         try   
           {   
     this.child.ClientSize      =      new      System.Drawing.Size(panel1.Size.Width,      panel1.Size.Height);   
           }   
         catch(System.Exception      Er)   
           {   
     MessageBox.Show(Er.ToString());   
           }   
     }  

编译无错,执行时(Error:      未将对象引用设置到对象的实例)   
     但连续点了4个一样的错误提示确认后,程序却可以正常执行,并且form1调整窗体大小form2也可以随之响应了。   
此计不行,又生一计.

我们可以把子窗体当成一个控件,设置Dock属性不就行了吗?

赶快测试一下:

private void button1_Click(object sender, EventArgs e)
           {

               ChildForm child = new ChildForm();
               child.TopLevel = false;
              child.Dock = System.Windows.Forms.DockStyle.Fill;
              child.FormBorderStyle = FormBorderStyle.None;
              //child.Parent = this.panel1;
              this.panel1.Controls.Add(child);
              child.Show();
           }

在Windows Form应用程序C#允许你在Panel控件嵌套或显示WPF(Windows Presentation Foundation)窗体,但这需要一些额外步骤。因为WinForms和WPF是两个不同的.NET框架下的UI技术,直接嵌入是不支持的。但是,你可以通过以下几个步骤实现: 1. 首先,你需要创建一个独立的WPF窗体项目,并确保其已经导出到Windows Presentation Foundation (XAML)文件。 2. 在WinForm项目的Form designer上,添加一个Panel控件。 3. 转换Panel的ControlType属性为UserControl,这样它就可以承载其他用户控件了。例如,在设计视图右键点击Panel -> Properties -> ControlType -> UserControl。 4. 使用XamlReader将WPF窗体(如MyWpfWindow.xaml)转换为WPF元素。这通常涉及到动态加载WPF窗体并将其内容添加Panel。你可以这样做: ```csharp var wpfDocument = XamlReader.Load(new Uri("pack://application:,,,/" + typeof(MyWpfWindow).Assembly.GetName().Name + ";component" + @"/MyWpfWindow.xaml", UriKind.RelativeOrAbsolute)); dynamic wpfElement = wpfDocument.RootVisual; panel.Controls.Add(wpfElement); ``` 5. 确保在运行对WPF窗体的依赖注入和数据绑定等操作也进行了适当的处理。 请注意,这种方法可能会有一些性能开销,并且不是官方推荐的最佳实践。如果你的需求足够复杂,考虑使用Windows Forms和WPF之间的交互模式,比如使用IWin32Window接口或者第三方库(如Fluent.Ribbon、SharpDX-WPF等)来集成部分WPF功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值