我已经有一段时间没有这样做了,所以不太确定如何做我需要的事情,但我确信它非常简单。
基本上,我有一个带有导航窗格的表单。我想做到这一点,以便当用户单击该窗格上的按钮时,说“主页”,它会更改表单上的内容,但实际上并不会切换到另一个表单,如果你明白我的意思吗?
例如,我希望导航窗格始终保持不变,我只想更改表单的内容。它几乎就像 Visual Studio 的“工具箱”中的“TabControl”工具,尽管我希望它们是显示在侧窗格中的按钮,而不是直接位于内容上方的选项卡。请参阅下图以获得更好的理解。谢谢!
(无论按下哪个按钮,侧窗格和标题都保持不变,但内容会发生变化。)
我会使用
UserControl
来实现这一点。单击按钮时会显示一个 UserControl
。我将创建一个接口(例如 IView
),该接口将由声明通用功能的每个 UserControl
实现,例如检查是否可以从一个功能切换到另一个功能的方法(例如表单的 OnClosing 事件),例如这个:
public interface IView
{
bool CanClose();
}
public UserControl View1: IView
{
public bool CanClose()
{
...
}
}
public UserControl View2: IView
{
public bool CanClose()
{
...
}
}
那么,切换视图就非常简单了:
private bool CanCurrentViewClose()
{
if (groupBox1.Controls.Count == 0)
return true;
IView v = groupBox1.Controls[0] as IView;
return v.CanClose();
}
private void SwitchView(IView newView)
{
if (groupBox1.Controls.Count > 0)
{
UserControl oldView = groupBox1.Controls[0] as UserControl;
groupBox1.Controls.Remove(oldView);
oldView.Dispose();
}
groupBox1.Controls.Add(newView);
newView.Dock = Dock.Fill;
}
在按钮中您可以执行以下操作:
private void btnHome_Click(object sender, EventArgs e)
{
if (CanCurrentViewClose())
{
ViewHome v = new ViewHome();
// Further initialization of v here
SwitchView(v);
}
else
{
MessageBox.Show("Current View can not close!");
}
}
我已经在很多场合成功地使用过这种方法。
最简单的方法是将多个面板放置为内容容器,实现内容管理器,保留对面板的引用并显示/隐藏所需的面板。
简单,但对于较小的应用程序它可以工作
您可以简单地使用具有任意多个
TabControl
的 TabPages
。对于 TabControl
,您可以将 Alignment
属性设置为 Left