用codejock的dockingpane.挺好用的
具体功能都已经实现了。
效果图:
步骤:
1.在窗体上放一个DockingPane的控件。
2.添加DockingPane的dll引用
3.添加using XtremeDockingPane;
4.设置DockingPan的属性
private void init(DataSet ds)
{
try
{
//创建面板
XtremeDockingPane.Pane PaneToolBox =
DockingPaneManager.CreatePane(ID.PANE_TOOLBOX,140, 100, DockingDirection.DockLeftOf, null);
PaneToolBox.Title = "工具栏";//设置标题
PaneToolBox.Hide();//隐藏
DockingPaneManager.RedrawPanes();//重绘
DockingPaneManager.Options.ShowContentsWhileDragging = true;//拖拽时是否显示内容
//显示移动标示
DockingPaneManager.Options.ShowDockingContextStickers = true;
DockingPaneManager.Options.AlphaDockingContext = true;
DockingPaneManager.VisualTheme = VisualTheme.ThemeWord2007;//设置主题
DockingPaneManager.PanelPaintManager.Font.Size = 9;//设置字号
DockingPaneManager.PanelPaintManager.Font.Bold = true;//设置粗体
}
catch (Exception ex)
{
}
}
5.设置要显示的内容。(自定义)
#region 为菜单数据源赋值
private static void InitMenu()
{
DataTable dt = new DataTable();
dt.Columns.Add("Uuid");
dt.Columns.Add("Resourcename");
dt.Columns.Add("Parentid");
dt.Columns.Add("SortCode");
DataRow dr = dt.NewRow();
dr[0] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[1] = "系统管理";
dr[2] = "0";
dr[3] = "6";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "5BBA2F6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "日志查看";
dr[2] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[3] = "0";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "6BBA2F6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "修改密码";
dr[2] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[3] = "1";
dt.Rows.Add(dr);
//
dr = dt.NewRow();
dr[0] = "5AE68889-2AF4-4C79-9564-6252AA35FE12";
dr[1] = "权限管理";
dr[2] = "0";
dr[3] = "5";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "分配权限";
dr[2] = "5AE68889-2AF4-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "5AE644449-2AF4-4C79-9564-6252AA35FE12";
dr[1] = "综合查询";
dr[2] = "0";
dr[3] = "4";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-23B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "人员查询";
dr[2] = "5AE644449-2AF4-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "5AE644449-2AF3-4C79-9564-6252AA35FE12";
dr[1] = "统计报表";
dr[2] = "0";
dr[3] = "3";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-83B1-4FD2-B061-F08BBD9BE71E";
dr[1] = "报表初审";
dr[2] = "5AE644449-2AF3-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
dsMenu.Tables.Add(dt);
}
#endregion
写一个事件,弹出CommandPane
private void DockingPaneManager_AttachPaneEvent(object sender, AxXtremeDockingPane._DDockingPaneEvents_AttachPaneEvent e)
{
try
{
switch (e.item.Id)
{
case ID.PANE_TOOLBOX:
if (frmCommandPaneView == null)
frmCommandPaneView = new CommandPane(dsMenu);
e.item.Handle = frmCommandPaneView.Handle.ToInt32();
break;
}
}
catch (Exception err)
{
}
}
在CommandPane里面
DataSet dsMenu;
public CommandPane(DataSet ds)
{
InitializeComponent();
dsMenu = ds;
CreateShortcutBar();
}
8,上面引用了这么一个方法
void CreateShortcutBar()
{
DataRow[] rowP;
DataRow[] rowC;
string uuid;
bool flag = false;
frmTopMenu top;
rowP = dsMenu.Tables[0].Select("Resourcename='综合查询'");
if (rowP.Length > 0)
{
uuid = rowP[0][0].ToString();
rowC = dsMenu.Tables[0].Select("Parentid='" + uuid + "'");
if (rowC.Length > 0)
{
top = new frmTopMenu("综合查询", dsMenu);
ShortcutBarItem ItemZH = wndShortcutBar.AddItem(ID.SHORTCUT_INBOX, "综合查询", top.Handle.ToInt32());
if (!flag)
{
wndShortcutBar.Selected = ItemZH;
flag = true;
}
}
}
wndShortcutBar.ExpandedLinesCount = wndShortcutBar.ItemCount;
wndShortcutBar.Icons = (XtremeShortcutBar.ImageManagerIcons)ImageManager.Icons;
}
上面用到了一个frmTopMenu窗体
static public frmTopMenu Instance;
DataSet ds;
public frmTopMenu()
{
InitializeComponent();
Instance = this;
}
public frmTopMenu(string caption, DataSet dsMenu)
{
InitializeComponent();
ds = dsMenu;
loadItems(caption);
menuCaption.Caption = caption;
}
获得传来的菜单数据集,然后调用这个方法
private void loadItems(string caption)
{
DataRow[] rowP;
DataRow[] rowC;
string uuid;
switch (caption)
{
case "综合查询":
tvwMenu.Nodes.Clear();
rowP = ds.Tables[0].Select("Resourcename='综合查询'", "SortCode ASC");
uuid = rowP[0][0].ToString();
rowC = ds.Tables[0].Select("Parentid='" + uuid + "'");
for (int i = 0; i < rowC.Length; i++)
{
string name = rowC[i][1].ToString();
icon++;
tvwMenu.Nodes.Add(name, name, icon, 0);
}
break;
}
}
窗体上有一个treeview和一个AxShortCutCaption控件
treeview有一个事件,用于显示标题内容
private void tvwMenu_MouseDown(object sender, MouseEventArgs e)
{
TreeNode tn = tvwMenu.GetNodeAt(e.X, e.Y);
if (tn != null)
{
string name = tn.Text;
MessageBox.Show(name);
}
}
至此,基本上显示就没有问题了。
总结:一个主窗口,一个CommandPane窗口。
主窗口有一个控件,名为DockingPaneManager,有一个事件。
CommandPane窗口有一个控件,名为CommandPane
问题;在不是MDI窗体的情况下,如何实现右侧内容随着菜单大小变化而变化位置?
解决:
private void DockingPaneManager_ResizeEvent(object sender, EventArgs e)
{
int left, top, right, bottom;
DockingPaneManager.GetClientRect(out left, out top, out right, out bottom);
this.groupBox1.SetBounds(left, top, right - left, bottom - top);
}
DockingPaneManager为工具栏的名字
groupBox1右边所有控件的容器的名字(用pane也一样)
XTP dockingpane的使用方法
最新推荐文章于 2020-07-15 09:47:53 发布