‘Nice’选项样式winforms对话框控件

在这里和那里我看到了很好的样式对话框控件,类似于Beyond Compare v4中出现的这个:

在此处输入图像描述

我自己的实现变得非常接近,它由左侧的列表框和用户控件组成,当列表框选中项目发生更改时,这些控件会发生变化。 然而,没有多少量的口红上的猪会让它看起来像上面那样。 我可以想象我如何使用自定义绘画等来实现这一点,但我的真正意图是在运行时而不是设计时生成左手条目(数据文件中的每列都会有一个)。

我想知道是否有人对如何合理地轻松实现这样的事情有任何想法,无论是使用组件(商业广告)还是其他一些巧妙的方法。

谢谢!

这是一个模仿你的设计的例子。 我有一个大panel1来容纳两侧,其中一个panel2容纳左侧。 在panel2里面有搜索控件和listview

搜索控件是包含TextBox和另一个Label2Label1Label.Images已对齐, Textbox没有边框。 LabelsAutoSize=falseLabel1具有3D边框。

Panel1有一个单独的边框, panel2ListView没有边框。 ListView具有View=Details和一列HeaderStyle=None 。 它还有OwnerDraw=true

我为ListView添加了一个Paint事件,但必须在代码中调用它。

请注意,我没有花时间创建漂亮的图像。 另请注意:它们的高度将决定物品的高度(!),因此在上方和下方留下一点透明的边框; 他们的好看将是整体外观的关键!

它们包含在具有适当SizeBitDepthImagelist 。 您可能需要调整DrawIamge数字..

右侧的东西非常标准; 对于水平条我使用height=1Border=SinglePanel 。 如果您有多个RadioButtons组,请务必将每个组放在一个单独的Pan​​el中,透明且无边框,当然..

 public Form1() { InitializeComponent(); listView1.Width = panel2.ClientSize.Width; listView1.Columns[0].Width = listView1.ClientSize.Width; listView1.Paint += listView1_Paint; listView1.BackColor = panel2.BackColor; leftBrush = new SolidBrush(panel2.BackColor); rightBrush = new SolidBrush(panel1.BackColor); } Pen borderPen = new Pen(SystemColors.ActiveBorder); SolidBrush leftBrush, rightBrush; private void listView1_DrawItem(object sender, DrawListViewItemEventArgs e) { if (e.ItemIndex == 0) listView1_Paint( null, new PaintEventArgs(e.Graphics, listView1.ClientRectangle)); if (!e.Item.Selected) { e.Graphics.FillRectangle(leftBrush, e.Bounds); e.Graphics.DrawLine(borderPen, listView1.Width-1, e.Bounds.Y, listView1.Width-1, e.Bounds.Bottom); } else { e.Graphics.FillRectangle(rightBrush , e.Bounds); e.Graphics.DrawLine(borderPen, 0, e.Bounds.Top, e.Bounds.Width, e.Bounds.Top); e.Graphics.DrawLine(borderPen, 0, e.Bounds.Bottom-1, e.Bounds.Width, e.Bounds.Bottom-1); } e.Graphics.DrawString( e.Item.Text, listView1.Font, Brushes.Black, 35, e.Bounds.Y + 5 ); e.Graphics.DrawImage(imageList1.Images[e.Item.ImageIndex], 2, e.Bounds.Y ); } void listView1_Paint(object sender, PaintEventArgs e) { int hh = listView1.Items.Count * imageList1.ImageSize.Height; e.Graphics.DrawLine(borderPen, listView1.Width - 1, hh, listView1.Width - 1, listView1.Height); } private void panel2_Paint(object sender, PaintEventArgs e) { e.Graphics.DrawLine(borderPen, panel2.Width-1, 0, panel2.Width-1, listView1.Top); } 

}

以下是我的Q&D版本的屏幕截图:

'很好'选项对话框]