返回首页

(转换为感谢戴夫)
{S0}简介
我目前在个人项目中,我想建立一个小型应用程序的Outlook 2003风格的导航工作。这包括Outlook侧边栏包含了丰富多彩的按钮。我一直在寻找这种控制在CodeProject上,到目前为止,我只能找到与WTL的C语言编写的。
我决定写的C#(2.0)和我自己的Outlook侧边栏的UserControl,所以它可以很容易地扩展和custimized开发的需要。因此,这个项目包含所有源可修改以任何方式和任何目的。
注意UserControl的,不包含任何2.0运行时的具体代码,所以它应该很容易将它移植回1.1的项目,如果需要的话。背景
我选择实施一个UserControl,因为它简化了解决方案,它易于调试,并编译到您的应用程序的可执行文件,留下一个非常小的足迹(即没有额外的DLL需要)。再用这种控制是根本的copynbsp问题;,并粘贴到您的下一个项目的UserControl来源。
因为我想写代码,很容易理解和修改,OutlookBar控制是一个简化版本Outlook的侧边栏。此外,控制不复杂的钩子,回调和Windows API的使用。毕竟,我们只是想方案C#!使用代码
只需包括Outlookbar.cs,OutlookBar.Designer.cs,OutlookBar.resx文件到您的项目。形式的OutlookBar UserControl的使用之前,确保你先编译所有。之后,在UserControl添加到您的工具箱。现在,您可以拖到窗体上。
注意OutlookBar控制是为了停靠在底部。这不是自动完成的,所以你必须设置Dock属性的底层控制。此外,您可以添加一个顶部分离器控制,这将允许你在运行时调整OutlookBar。
OutlookBar包含了一组按钮(类型OutlookBarButton),可以添加在运行时的UserControl。在这种控制的更新版本,它现在可以在设计时设置按钮!通过简单地利用[DesignerSerializationVisibility()]属性的感谢。
然而,在运行时添加的按钮,你可以把下面的代码在Form_Load事件。请确定您添加的OutlookStyleControls命名空间的形式。 / /我们无法找到您所查找的内容,以imagen可预期被初始化和加载。这些图像 / /代表按钮的图标(最大尺寸30x26)。 outlookBar1.Buttons.Add("按钮1quot;,我们无法找到您所查找的内容); outlookBar1.Buttons.Add("按钮2quot;,image2); ... ... outlookBar1.Buttons.Add("按钮nquot;,imagen可); outlookBar1.Height = outlookBar1.MaximumSize.Height;
注意最后一行。 OutlookBar将自动调整自身大小的按钮的尺寸。加入所有的按钮后,最大限度地控制其允许的最大高度。所有的按钮,然后将在表单上可见。
在运行时,点击其中一个按钮,将产生一个Click事件。要确定单击按钮,您可以使用下面的代码为:private void outlookBar1_Click(对象发件人, OutlookStyleControls.OutlookBar.ButtonClickEventArgs发送) { IDX = outlookBar1.Buttons.IndexOf(e.Button); 开关(IDX) { &# 160;0:/ /按钮1被点击   ; / /代码为Button1在这里你的行动 &# 160; 打破; 例1:/ / 2被点击的按钮  0; / /代码为Button1在这里你的行动 & #160; 打破;   ; ... ... } }这有它。该控件包含一些额外的功能:在设计时设置OutlookBar的按钮。在特定位置的用户控件的HitTest()方法返回按钮。例如,它是在MouseDown或MouseUp事件。控制使用的颜色方案可以编程设置。每个控制按钮上有一个标签属性,您可以使用更多的信息绑定按钮。ButtonHeight财产, 它允许您显示无论是规模较小或更大的在你的控制按钮。设计和可扩展性
你可能期望相反,控制已实施定期UserControl的作为,而不是一个控制contrainer。控制按钮,因此不UserControls的本身,而是简单的(内心公众)OutlookBar控制类(见图表)。
这使得实施的控制容易得多。有没有必要配合容器接口,需要实现。只有需要捕捉,实施基本控制事件,并重写需要的地方。

Paint事件管理整个控制的图纸。它会循环通过目前在它的按钮集合的按钮和呼叫PaintButton每个按钮像这样的方法为:private void OutlookBar_Paint(对象发件人,  60; PaintEventArgs的发送) { 顶部= 1; 0; FOREACH(b OutlookBarButton在按钮)   ; { b.PaintButton(e.Graphics,1,顶, &# 160; b.Equals(this.selectedButton),FALSE);  0; 顶部= b.Height 1; } 60; }每个按钮上呈现控件本身。 PaintButton方法的其他标志表明w​​hethernbsp一个按钮应该呈现为正常,选择,或突出。
此外,MouseOver事件是由控制捕获,要突出鼠标移到按钮。为了不重绘整个控制和防止闪烁,只有按钮,在外观上的改变是粉刷一新。
这也为Click事件。 SelectedButton财产自动设置,并相应的按钮,会令本身的选择。 UserControl的覆盖Click事件,并实现了一个新的Click事件的ButtonClickEventHandler。因为,我们要通过一个额外的参数说明哪一个按钮被按下的事件。为此,ButtonClickEventArgs类是实施包括由主机应用程序可以使用一个按钮(只读)属性。
未来的扩展将包括:调整处理,显示在Outlook中,这样可以让你来调整控制。这现在可以做一个分配器的,但是,在视觉上它只是不具吸引力。实施上下部的OutlookBar的快捷按钮。当缩小规模的控制,每个按钮的图标是在这里列出,并可以通过点击访问(请参阅Outlook)。使用的配色方案自动计算。我不知道如何展望目前这。如果任何人有这个想法,请让我知道。
除了这些extenstions外,控制是非常完整。兴趣点
我学到了易于使用实施纯C#你自己的UserControl使用。NET图形库。这导致在表现良好的小型可重复使用的一个非常小的足迹控制。
此外,我学会了如何通过允许在设计时设置控制实施控制完成。具体来说,坚持设计时间OutlookBar按钮集合花了一些时间才能体现出来。历史
OutlookBar UserControl的1.0版本写于2006年5月25日。这篇文章发表于2006年5月26日。
1.1版发布29日2006年5月包含一个大的改善OutlookBar控制在设计时添加按钮。还收集OutlookBar按钮现在CollectionBase类的基础上实施,以减少行代码。
十一月第二届2006年 - 戴夫,VB.NET版本是可为您控制tonbsp;下载。

回答

评论会员:act_mrv_3011 时间:2011/12/06
错误1无法隐式转换类型'System.EventHandler','OutlookStyleControls.OutlookBar.ButtonClickEventHandler"C:\用户\法\应用程序数据\本地\临时项目\ WindowsFormsApplication1 \ UserControl1.Designer.cs 52 27 WindowsFormsApplication1
我有一个像这样在Visual C#速成2010的错误,我couldnt解决这个问题。问题是什么
评论会员:?nroda 时间:2011/12/06
我可以把窗体上的控件,并添加按钮
但是当我运行的项目,我不能见一面吧。
帮助任何人。

NRoda
评论会员:。HerreKuijpers 时间:2011/12/06
?你停靠的控制
Herre
评论会员:Jak111 时间:2011/12/06
嘿,我再次
第一个按钮悬停选择区域按钮的高度的一半,这会影响其他按钮。
所以,当我悬停在一个按钮下方将选择按钮的下半部,如果我单击"确定"。
任何修复?
感谢
评论会员:。Jak111 时间:2011/12/06
觉得这里免费帮我
评论会员:。snblackout 时间:2011/12/06
这是由于四舍五入,因为试图确定鼠标指针下的指数方程指数,以修复做到以下几点:

在控制OutlookBar_MouseMove,改变

Dim index As Integer = CInt((e.Location.Y - 1) / (m_buttonHeight + 1))

{C}
OutlookBar_Click,改变

Dim index As Integer = CInt((mea.Y - 1) / (m_buttonHeight + 1))
Dim index As Integer = Math.Floor((mea.Y - 1) / (m_buttonHeight + 1))

评论会员:Jak111 时间:2011/12/06
伟大的代码到目前为止但IM使用VB之一,于2010年,我不能似乎得到的点击功能,工作
IVE分放在一个MsgBox,但它doesnt甚至弹出说,有人可以给我一个工作代码?
感谢
评论会员:Jak111 时间:2011/12/06
!固定
OK,它固定后,插科打诨,我的InitializeComponent(),所以我评论说出来,然后它的工作
评论会员:。HerreKuijpers 时间:2011/12/06
伟大,我只是喜欢它的东西为自己工作时...
Herre
评论会员:kasbaba 时间:2011/12/06
非常好写的文章,和同样惊人的控制!感谢Herre
评论会员:!securigy 时间:2011/12/06
添加栏上每个按钮的图像。图像是PNG和白色作为背景色。
当栏显示白色图像没有显示为透明。正是在设置属性,请允许我形象BKG颜色透明在哪里?或者我不手动,如果有的话,如何
评论会员:?HerreKuijpers 时间:2011/12/06
透明度是图像本身。
PNG支持阿尔法通道(透明度)
所以你的背景不应该是白色的,它应该是透明的。

欢呼声中,
Herre
Herre
评论会员:securigy 时间:2011/12/06
可能是什么原因,控制不显示在工具箱中
?我所有3个源文件复制到我的项目和现有项目添加到项目。然后我编译整个项目(重建)。我打开工具箱,它不存在... ...不知道怎么回事,我可以添加控制的形式 - 我不会tlike动态添加 - 太多的麻烦... ...
任何想法
评论会员:?HerreKuijpers 时间:2011/12/06
您使用的是什么版本的Visual Studio
Herre
评论会员:securigy 时间:2011/12/06
VS2008的。我决心通过一个类库,然后使用选择... ...菜单项导入到通用工具箱
评论会员:马龙克鲁兹 时间:2011/12/06
喜。我在想,如果可能的话有一个默认的"突出显示"按钮,加载表单时。我实现了我的主要形式outlookbar控制内。
我想实现这个"默认"按钮,不知道如何... plz帮助?
thnx
评论会员:HerreKuijpers 时间:2011/12/06
简单的设置SelectedButton财产:

outlookBar1.SelectedButton = outlookBar1.Buttons[0];

希望这个工程,
欢呼声中,
Herre
评论会员:会员3110819 时间:2011/12/06
如果以自己的Outlook中的侧边栏,你可以访问
评论会员:DotDue 时间:2011/12/06
我有下载的代码(C#),并开始以看它,但是,自我使用VS2008我先转换。除了图像文件的问题,缺少从源头上下载。我手动从资源中提取。

然而,我的问题是,每当我尝试打开在设计形式,或尝试将控件添加到一个新的形式,我得到这个:

Failed to create component 'OutlookBar'.  The error message follows:

'System.Xml.XmlException: An error occurred while parsing EntityName. Line 2, position 61.

at System.Xml.XmlTextReaderImpl.Throw(Exception e)

at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)

at System.Xml.XmlTextReaderImpl.ParseEntityName()

at System.Xml.XmlTextReaderImpl.ParseAttributeValueSlow(Int32 curPos, Char quoteChar, NodeData attr)

at System.Xml.XmlTextReaderImpl.ParseAttributes()

at System.Xml.XmlTextReaderImpl.ParseElement()

at System.Xml.XmlTextReaderImpl.ParseElementContent()

at System.Xml.XmlTextReaderImpl.Read()

at System.Xml.XmlTextReader.Read()

at Microsoft.VisualStudio.Design.VSTypeResolutionService.GeneratedAssemblyEntry.RealizeMoniker(String moniker)

at Microsoft.VisualStudio.Design.VSTypeResolutionService.GeneratedAssemblyEntry.get_FileName()

at Microsoft.VisualStudio.Design.VSTypeResolutionService.AssemblyEntry.get_Assembly()

at Microsoft.VisualStudio.Design.VSTypeResolutionService.GeneratedAssemblyEntry.get_Assembly()

at Microsoft.VisualStudio.Design.VSTypeResolutionService.AssemblyEntry.Search(String fullName, String typeName, Boolean ignoreTypeCase, Assembly& assembly, String description)

at Microsoft.VisualStudio.Design.VSTypeResolutionService.SearchGeneratedEntries(AssemblyName assemblyName, String typeName, Boolean ignoreTypeCase, Assembly& assembly)

at Microsoft.VisualStudio.Design.VSTypeResolutionService.SearchEntries(AssemblyName assemblyName, String typeName, Boolean ignoreCase, Assembly& assembly, ReferenceType refType)

at Microsoft.VisualStudio.Design.VSTypeResolutionService.GetType(String typeName, Boolean throwOnError, Boolean ignoreCase, ReferenceType refType)

at Microsoft.VisualStudio.Design.Serialization.CodeDom.AggregateTypeResolutionService.GetType(String name, Boolean throwOnError, Boolean ignoreCase)

at Microsoft.VisualStudio.Design.Serialization.CodeDom.AggregateTypeResolutionService.GetType(String name, Boolean throwOnError)

at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.GetType(ITypeResolutionService trs, String name, Dictionary`2 names)

at System.ComponentModel.Design.Serialization.CodeDomSerializerBase.FillStatementTable(IDesignerSerializationManager manager, IDictionary table, Dictionary`2 names, CodeStatementCollection statements, String className)

at System.ComponentModel.Design.Serialization.TypeCodeDomSerializer.Deserialize(IDesignerSerializationManager manager, CodeTypeDeclaration declaration)

at System.ComponentModel.Design.Serialization.CodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager manager)

at Microsoft.VisualStudio.Design.Serialization.CodeDom.VSCodeDomDesignerLoader.PerformLoad(IDesignerSerializationManager serializationManager)

at System.ComponentModel.Design.Serialization.BasicDesignerLoader.BeginLoad(IDesignerLoaderHost host)' 


我不知道自定义控件几乎足以轻松弄清楚什么是错的。

有什么建议?

-
托马斯由于
"个人精神错乱,是罕见的东西 - 但在团体,政党,国家和时代,它是规则"
- 尼采
评论会员:HerreKuijpers 时间:2011/12/06
我现在还装在VS2008解决方案
后转换成功,确保你第一次编译项目之前,开放的形式。
在这里,我尝试了编译成功,在设计模式下打开的形式,没有任何问题。

希望它帮助,

Herre
评论会员:brindhakr 时间:2011/12/06
大家好,
我加入了我outlookbar.When单击事件,我用的是Click事件编写相应的代码在我form.Now的Outlook工具,它看起来像
LT; codegt; OutlookBar4_Click分(#System.Object的,BYVAL e由于发件人)把手OutlookBar4.Click

END SUB

相反,它应该显示为
LT; codegt;分(作为对象,BYVAL Ë作为OutlookStyleControls.OutlookBar.ButtonClickEventArgs BYVAL发件人)outlookBar1_Click的把手outlookBar1.Click

END SUB

我的任务是编写代码来outlookbar单个按钮。请帮助我。
预先感谢
Brindha
评论会员:19kerem84 时间:2011/12/06
我如何使用这个控制项,并添加我的工具箱
评论会员:会员1365758 时间:2011/12/06
嗨,第一件事第一!!伟大尝试,并感谢一吨共享代码。
我面临的一个问题上的最后一个按钮控制。最后一个按钮是不可见的,当我认为在中国/日本制的形式。
我不是因为如果其确定的VM或做chinse或日本。请帮助/建议。


SS
评论会员:。angels777 时间:2011/12/06
第一wornderful这里所有的感谢。伟大的职位。
我的问题是怎么U打开表单按钮每次ü点击,而不是只显示文字?例如接触前景侧边栏上的按钮上按一下时,它应该调用上contactform.cs。你怎么调用的形式将它修复内容页的大小

只是调用的话出​​来...
switch (idx)

            {

                case 0: // contacts

                    ShowPanes("show contacts options here", "show sheet with contacts here");

                    break;

                case 1: // mail

                    ShowPanes("show mail folders here", "show list of mails here");

                    break;

                case 2: // calendar

                    ShowPanes("show calendar control here", "show agenda here");

                    break;

                case 3: // tasks

                    ShowPanes("show task options here", "show list of tasks here");

                    break;

                default: // notes

                    ShowPanes("show notes options here", "show post-it format notes here");

                    break;

            }   

评论会员:angels777 时间:2011/12/06
??任何想法