我需要在winforms中开发几个日历类型控件。这些日历本质上都是垂直的。概念是日历将包含每天(月视图),小时(日视图)或周(年视图)的列。我附上了月视图的样本(相当粗糙)图像。
到目前为止,我已经使用表格布局面板进行了很好的破解,其中包含许多面板和标签。这可行,但它很乱,加载速度很慢。它还带来了一系列我试图克服的问题。我附上了截屏,了解它当下的样子。
我遇到了渲染中的问题(众所周知的口吃问题),我在构建时隐藏了网格,然后在完成后显示它。此外,我在使表格正确调整大小时遇到了问题(列数会根据当月的天数而变化),正如您在屏幕截图中看到的那样,底行会占用所有空间。你可以想象,这一切都非常讨厌,在我看来相当hacky。
我已经尝试了WPF,看看我是否可以克服这些问题,但似乎虽然它可能会有所改善,但列和行大小调整的问题是相同的。我可以采取其他方法来避免这些问题,还是最好咬紧牙关并切换到WPF?我发现它令人沮丧,因为使用表格在HTML中完成这项工作将非常容易。
重申我遇到的问题:
我感谢用户对如何最好地解决问题的任何反馈。
答案 0 :(得分:1)
我没有很多表布局面板的经验,但在快速浏览一下之后,似乎有固定大小的选项,用于固定数量的列/行(您可以在代码中更改)和每列的百分比大小设置。例如,在加载31天的月份时,您将创建31列,其宽度百分比约为3.2258。你可能会做这样的事情:
int numColumns = 31;
tableLayoutPanel1.ColumnCount = numColumns;
tableLayoutPanel1.ColumnStyles.Clear();
for (int i = 0; i < numColumns; i++)
{
tableLayoutPanel1.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100f / numColumns));
}
这意味着当您调整窗口大小时,每天保持相同的大小,它们都会扩展以适应控件的宽度。如果该大小对您来说太小,并且您需要将列设置为最小宽度,则可以将TableLayoutPanel放在启用了AutoScroll的控件内,并设置TableLayoutPanel的最小大小,如下所示:
int minColumnWidth = 20;
tableLayoutPanel1.MinimumSize = new Size(numColumns * minColumnWidth, 0);
WPF可以做得更好,但如果你没有经验,可能需要更长的时间。
在Windows窗体中,您始终可以使用Graphics类手动绘制日历,并在自定义控件中覆盖OnPaint。这样可以避免儿童控件造成的闪烁和缓慢问题,并且比WPF更容易学习。
答案 1 :(得分:0)
已经差不多一年了,但是因为我遇到了你的问题,我想分享一下我在CodeProject上发现的一个很好的Outlook风格Winforms Calendar Agenda。