亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

在winform下實現左右布局多窗口界面的方法之續篇

2020-01-24 01:15:20
字體:
來源:轉載
供稿:網友

在上篇文章在winform下實現左右布局多窗口界面的方法已經實現了左右布局多窗口界面,今天本來是研究基于winform的插件編程,沒想到順便又找到了另一種實現方案,這種實現方案更簡單,要寫的代碼也很少,具體實現如下。

可視化設計部份:

1.父窗口:ParentForm的IsMdiContainer 設置為 true,即:this.IsMdiContainer=true;

2.在父窗口中添加一個頂部菜單:menuStrip1,并新增一個菜單項:Windows,且將menuStrip1的MdiWindowListItem設置為該Windows菜單對象,即: this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;

3.在父窗口中添加一個樹形菜單:treeView1,并將其Dock設為左靠齊,即:this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;且將margin設為0;

4.在父窗口中添加一個Panel:panel1,且將其width設為3;

以下是設計后自動生成的代碼:

namespace WinFormTest{partial class ParentForm{/// <summary>/// 必需的設計器變量。/// </summary>private System.ComponentModel.IContainer components = null;/// <summary>/// 清理所有正在使用的資源。/// </summary>/// <param name="disposing">如果應釋放托管資源,為 true;否則為 false。</param>protected override void Dispose(bool disposing){if (disposing && (components != null)){components.Dispose();}base.Dispose(disposing);}#region Windows 窗體設計器生成的代碼/// <summary>/// 設計器支持所需的方法 - 不要/// 使用代碼編輯器修改此方法的內容。/// </summary>private void InitializeComponent(){this.menuStrip1 = new System.Windows.Forms.MenuStrip();this.windowsToolStripMenuItem = new System.Windows.Forms.ToolStripMenuItem();this.treeView1 = new System.Windows.Forms.TreeView();this.panel1 = new System.Windows.Forms.Panel();this.menuStrip1.SuspendLayout();this.SuspendLayout();// // menuStrip1// this.menuStrip1.Items.AddRange(new System.Windows.Forms.ToolStripItem[] {this.windowsToolStripMenuItem});this.menuStrip1.Location = new System.Drawing.Point(0, 0);this.menuStrip1.MdiWindowListItem = this.windowsToolStripMenuItem;this.menuStrip1.Name = "menuStrip1";this.menuStrip1.Size = new System.Drawing.Size(684, 25);this.menuStrip1.TabIndex = 0;this.menuStrip1.Text = "menuStrip1";// // windowsToolStripMenuItem// this.windowsToolStripMenuItem.Name = "windowsToolStripMenuItem";this.windowsToolStripMenuItem.Size = new System.Drawing.Size(73, 21);this.windowsToolStripMenuItem.Text = "Windows";// // treeView1// this.treeView1.Dock = System.Windows.Forms.DockStyle.Left;this.treeView1.Location = new System.Drawing.Point(0, 25);this.treeView1.Margin = new System.Windows.Forms.Padding(0);this.treeView1.Name = "treeView1";this.treeView1.Size = new System.Drawing.Size(228, 380);this.treeView1.TabIndex = 3;this.treeView1.NodeMouseDoubleClick += new System.Windows.Forms.TreeNodeMouseClickEventHandler(this.treeView1_NodeMouseDoubleClick);// // panel1// this.panel1.Anchor = ((System.Windows.Forms.AnchorStyles)(((System.Windows.Forms.AnchorStyles.Top | System.Windows.Forms.AnchorStyles.Bottom) | System.Windows.Forms.AnchorStyles.Left)));this.panel1.BackColor = System.Drawing.Color.Red;this.panel1.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;this.panel1.Cursor = System.Windows.Forms.Cursors.VSplit;this.panel1.Location = new System.Drawing.Point(230, 28);this.panel1.Margin = new System.Windows.Forms.Padding(0);this.panel1.Name = "panel1";this.panel1.Size = new System.Drawing.Size(3, 100);this.panel1.TabIndex = 5;// // Form1// this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F);this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;this.ClientSize = new System.Drawing.Size(684, 405);this.Controls.Add(this.panel1);this.Controls.Add(this.treeView1);this.Controls.Add(this.menuStrip1);this.IsMdiContainer = true;this.MainMenuStrip = this.menuStrip1;this.Name = "Form1";this.Text = "Form1";this.Load += new System.EventHandler(this.Form1_Load);this.Resize += new System.EventHandler(this.Form1_Resize);this.menuStrip1.ResumeLayout(false);this.menuStrip1.PerformLayout();this.ResumeLayout(false);this.PerformLayout();}#endregionprivate System.Windows.Forms.MenuStrip menuStrip1;private System.Windows.Forms.ToolStripMenuItem windowsToolStripMenuItem;private System.Windows.Forms.TreeView treeView1;private System.Windows.Forms.Panel panel1;}}

編碼部份:

其實上面的設計后,如果通過以下定義的方法打開一個子窗口,則直接實現了左右布局且包含多子窗口的界面。

private void ShowChildForm<TForm>() where TForm : Form, new(){Form childForm = new TForm();childForm.MdiParent = this;childForm.Name = "ChildForm - " + DateTime.Now.Millisecond.ToString();childForm.Text = childForm.Name;childForm.Show();}

當然仍然有不完美的地方,那就是左邊菜單欄寬度不能動態調整,而又沒有用到splitContainer,故我們只有自己來實現,其實也很簡單,步驟如下: 

1.在父窗口構造函數中加入初始化panel1(用作分割器)位置及訂閱相關事件,代碼如下:

public ParentForm(){InitializeComponent();panel1.MouseDown += panel1_MouseDown;panel1.MouseUp += panel1_MouseUp;panel1.MouseMove += panel1_MouseMove;panel1.Top = menuStrip1.Height;panel1.Left = treeView1.Left + treeView1.Width;panel1.Height = panel1.Parent.Height;}

上述代碼的作用是:1.保證panel1的高度與位置與左側樹形菜單控件相匹配;2.訂閱的三個Mouse事件主要是為了后面實現移動panel1。

2.實現訂閱的三個Mouse事件所對應的方法,分別為鼠標按下、鼠標移動、鼠標松開,代碼如下:

private bool startMove = false; //用于標記是否在移動中void panel1_MouseMove(object sender, MouseEventArgs e){if (startMove){panel1.Left += e.X;}}void panel1_MouseUp(object sender, MouseEventArgs e){if (startMove){panel1.Left += e.X;startMove = false;this.treeView1.Width = panel1.Left;}}void panel1_MouseDown(object sender, MouseEventArgs e){startMove = true;} 

上述代碼作用:按下鼠標標記為開始移動,然后移動鼠標,若是標記移動中,說明是要移動panel1,故直接將鼠標當前的X坐標位置累加到panel1.Left屬性上,從而實現移動,當鼠標彈起后,則將樹形菜單的寬度設置為panel1.Left,從而實現樹形菜單隨panel1的移動而改變大小。

同時為了保證panel1的高度始終與樹形菜單相同,在父窗口的Resize方法加入動態調整panel1的高度,代碼如下:

private void ParentForm_Resize(object sender, EventArgs e){panel1.Height = panel1.Parent.Height;}

到此就完成了整個的實現方案,為了便于模擬在樹形菜單中雙擊打開子窗口的效果,同時也添加了如下代碼:

private void ParentForm_Load(object sender, EventArgs e){LoadMenuNodes();}private void LoadMenuNodes() //實現情況應該是從數據庫及用戶權限來進行動態創建菜單項{this.treeView1.Nodes.Clear();var root = this.treeView1.Nodes.Add("Root");for (int i = 1; i <= 10; i++){var section = root.Nodes.Add("Section-" + i);int maxNodes = new Random(i).Next(1, 10);for (int n = 1; n <= maxNodes; n++){section.Nodes.Add(string.Format("Level-{0}-{1}", i, n));}}}private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Node.Nodes.Count <= 0)//當非父節點(即:實際的功能節點){ShowChildForm<ChildForm>();}}

附上完整的實現代碼:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using System.Drawing;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Windows.Forms;namespace WinFormTest{public partial class ParentForm : Form{private bool startMove = false;public ParentForm(){InitializeComponent();panel1.MouseDown += panel1_MouseDown;panel1.MouseUp += panel1_MouseUp;panel1.MouseMove += panel1_MouseMove;panel1.Top = menuStrip1.Height;panel1.Left = treeView1.Left + treeView1.Width;panel1.Height = panel1.Parent.Height;}void panel1_MouseMove(object sender, MouseEventArgs e){if (startMove){panel1.Left += e.X;}}void panel1_MouseUp(object sender, MouseEventArgs e){if (startMove){panel1.Left += e.X;startMove = false;this.treeView1.Width = panel1.Left;}}void panel1_MouseDown(object sender, MouseEventArgs e){startMove = true;}private void ParentForm_Load(object sender, EventArgs e){LoadMenuNodes();}private void treeView1_NodeMouseDoubleClick(object sender, TreeNodeMouseClickEventArgs e){if (e.Node.Nodes.Count <= 0)//當非父節點(即:實際的功能節點){ShowChildForm<ChildForm>();}}private void ParentForm_Resize(object sender, EventArgs e){panel1.Height = panel1.Parent.Height;}private void LoadMenuNodes() //實現情況應該是從數據庫及用戶權限來進行動態創建菜單項{this.treeView1.Nodes.Clear();var root = this.treeView1.Nodes.Add("Root");for (int i = 1; i <= 10; i++){var section = root.Nodes.Add("Section-" + i);int maxNodes = new Random(i).Next(1, 10);for (int n = 1; n <= maxNodes; n++){section.Nodes.Add(string.Format("Level-{0}-{1}", i, n));}}}private void ShowChildForm<TForm>() where TForm : Form, new(){Form childForm = new TForm();childForm.MdiParent = this;childForm.Name = "ChildForm - " + DateTime.Now.Millisecond.ToString();childForm.Text = childForm.Name;childForm.Show();}}}

最終效果如下圖示:

說明:我這里為了體現分割器,故將其背景色設為紅色,便于大家觀察,這種解決方案與之前的解決方案功能上是相同的,但有一點小小區別,之前的解決方案中子窗口的標題欄是在父窗口的容器內,而本文的解決方案中子窗口在最大化后,子窗口的標題欄會與父窗口合并,如下圖示,至于大家用哪種依實際場景。


關于在winform下實現左右布局多窗口界面的方法之續篇的相關知識就給大家介紹到這里,后續時間我會繼續研究winform關于插件式編程(近期工作任務要求),到時候同樣會分享給大家,也歡迎大家一起交流,當然高手可以無視。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91爱爱小视频k| 国产精品福利在线观看| 最近日韩中文字幕中文| 性欧美xxxx| 91精品久久久久久久久不口人| 国产手机视频精品| 久久国产精品偷| 亚洲人成网7777777国产| 狠狠色狠狠色综合日日小说| 精品国产成人av| 成人午夜激情免费视频| 久久99热精品这里久久精品| 色爱av美腿丝袜综合粉嫩av| 日韩精品在线免费观看| 黑人巨大精品欧美一区免费视频| 全亚洲最色的网站在线观看| 日本不卡视频在线播放| 亚洲精品国产品国语在线| 国产精品人人做人人爽| 在线看福利67194| 色婷婷成人综合| 国产中文日韩欧美| 国产成人亚洲精品| 国产精品午夜一区二区欲梦| 亚洲午夜精品视频| 成人一区二区电影| 最近2019中文字幕一页二页| 日韩在线免费视频观看| 欧美激情第6页| 欧美激情喷水视频| 国产亚洲福利一区| 国产极品精品在线观看| 欧美一性一乱一交一视频| 久久久久久久影院| 亚洲人高潮女人毛茸茸| 欧美色视频日本高清在线观看| 亚洲精品欧美极品| 亚洲电影免费观看高清完整版在线观看| 国产乱肥老妇国产一区二| 成人欧美一区二区三区黑人| 91在线观看免费| 亚洲深夜福利在线| 国产精品国产三级国产专播精品人| 日本久久91av| 成人免费视频xnxx.com| 亚洲欧美制服中文字幕| 宅男66日本亚洲欧美视频| 97成人精品视频在线观看| 国产91精品在线播放| 青青青国产精品一区二区| 欧美性猛交xxxxx水多| 亚洲tv在线观看| 日韩美女免费观看| 日韩av在线电影网| 国产精品一区二区3区| 久久久久久亚洲精品| 亚洲尤物视频网| 国产精品日韩欧美大师| 日本精品在线视频| 欧美日韩加勒比精品一区| 高清一区二区三区四区五区| 亚洲a级在线播放观看| 欧美极品少妇与黑人| 亚洲国产成人久久| 亚洲免费av电影| 久久天天躁狠狠躁夜夜爽蜜月| 九九精品在线播放| 欧美成人精品影院| 4438全国亚洲精品在线观看视频| 久久久久久久久久av| 亚洲久久久久久久久久久| 91精品国产高清久久久久久久久| 久久久av亚洲男天堂| 亚洲最大在线视频| 国产亚洲欧美日韩美女| 亚洲97在线观看| 大桥未久av一区二区三区| 久久亚洲精品国产亚洲老地址| 欧美日韩人人澡狠狠躁视频| 日韩高清不卡av| 97精品国产97久久久久久春色| 久久久视频在线| 日韩精品高清在线观看| 国产精品h片在线播放| 亚洲人免费视频| 日本国产精品视频| 亚洲国产精品va在线看黑人| 欧美性xxxx极品高清hd直播| 热re99久久精品国产66热| 91精品国产高清久久久久久91| 久久精品免费电影| 久久五月情影视| 不用播放器成人网| 国内精品久久久久久影视8| 97超级碰碰人国产在线观看| 欧美性xxxx极品高清hd直播| 国产91精品久| 欧美大片免费观看在线观看网站推荐| 欧美一级视频一区二区| 92裸体在线视频网站| 伊人伊成久久人综合网小说| 一区二区三区久久精品| 国产视频欧美视频| 国产亚洲精品激情久久| 国产69精品久久久久9| 美日韩精品视频免费看| 亚洲欧美国产一本综合首页| 欧美一级视频免费在线观看| 91色琪琪电影亚洲精品久久| 成人在线国产精品| 国产精品九九九| 日本乱人伦a精品| 国产精品扒开腿做爽爽爽视频| 国产精品日韩电影| 在线午夜精品自拍| 不卡在线观看电视剧完整版| 欧美一级淫片丝袜脚交| 91精品国产九九九久久久亚洲| 国产精品一区二区久久精品| 日本精品一区二区三区在线| 久久久99久久精品女同性| 欧美第一黄色网| 欧美电影《睫毛膏》| 成人精品视频久久久久| 最近2019中文免费高清视频观看www99| 日本a级片电影一区二区| 国产精品极品在线| 欧美电影免费观看高清完整| 奇米4444一区二区三区| 98视频在线噜噜噜国产| 国产福利精品av综合导导航| 久久青草福利网站| 在线午夜精品自拍| 精品国产电影一区| 亚洲天堂视频在线观看| 狠狠久久亚洲欧美专区| 亚洲最新av在线网站| 国产精品久久久久久久久粉嫩av| 精品女同一区二区三区在线播放| 国产www精品| 精品国产一区二区三区久久狼5月| 欧美日韩激情视频| 国产亚洲精品久久久优势| 中文字幕一区二区三区电影| 91精品在线国产| 日韩在线中文字| 欧美激情在线观看视频| 精品久久久av| 久久在精品线影院精品国产| 欧美丰满老妇厨房牲生活| 国产精品美女在线观看| 国产一区二区三区在线视频| 久久久av网站| 国内外成人免费激情在线视频| 韩国v欧美v日本v亚洲| 亚洲系列中文字幕| 欧美日韩国产丝袜美女| 日韩欧美在线视频日韩欧美在线视频| 成人免费自拍视频| 欧洲成人午夜免费大片| 国产精品丝袜白浆摸在线| 亚洲精品xxx| 久久99精品久久久久久噜噜| 亚洲精品午夜精品|