商信互联
本示例演示如何修改默认功能区模板-创建功能区页面组并将操作放入其中。
XAF提供了WinForms应用程序的两种表单样式:Ribbon和Standard。可以使用“选项”节点的IModelOptionsWin.FormStyle属性选择应用程序的表单样式。本示例演示如何修改默认功能区模板-创建功能区页面组并将操作放入其中。如果您的FormStyle是Standard,请参考如何:创建自定义WinForms标准模板一文。
DevExpress代码示例数据库(http://www.devexpress.com/example=E216)中提供了完整的示例项目。
考虑以下“视图”类别中的“操作”:
public class MyViewController : ViewController {
public MyViewController() {
SimpleAction myAction = new SimpleAction(this, "MyAction", "View");
myAction.ImageName = "Action_SimpleAction";
}
}
Public Class MyViewController
Inherits ViewController
Public Sub New()
Dim myAction As New SimpleAction(Me, "MyAction", "View")
myAction.ImageName = "Action_SimpleAction"
End Sub
End Class
默认情况下,您只能将此操作放入现有的预定义类别中。下面的步骤演示了如何将该操作放置在功能区控件中的自定义位置。
在解决方案资源管理器中,右键单击WinForms应用程序项目,然后选择“添加DevExpress项”。New Item ...调用模板库。然后选择XAF WinForms模板|。细部功能区表单模板项目项,然后按添加项。
在功能区表单设计器中,聚焦功能区控件,单击右上角的智能标记,然后单击“运行设计器”。
在调用的XAF功能区控件设计器中,创建一个功能区页组。您可以将其添加到现有的功能区页面中,也可以将新页面添加到默认或自定义页面类别中。
关闭“ XAF功能区控件设计器”窗口。在功能区表单设计器中,右键单击新创建的“功能区页面组”,然后选择“就地链接容器”(BarLinkContainerExItem)。
您还可以将操作容器添加到状态栏。在详细信息表单设计器的“状态栏”菜单中,右键单击“ StatusMessages”,然后选择“就地链接容器(BarLinkContainerExItem)”。然后,为新的链接容器指定标题,例如“我的状态操作”。
将链接容器的标题设置为我的动作。
再次打开XAF Ribbon Control Designer。选择XAF动作控件| 导航面板中的“操作容器”。要从链接容器创建动作容器,请将“我的动作”项从“条形容器控件”列表中拖到“动作容器”中。
如果您还想将动作容器放置到状态栏,请将“我的状态动作”项从“栏容器控制”列表中拖到“动作容器”。
在右侧的属性网格中,为创建的操作容器指定ActionCategory。例如,将其设置为MyActionCategory。
将要放置的操作的类别更改为已创建的功能区页面组。使用上一步中指定的值(例如MyActionCategory)。如果您的Action是用代码创建的,则可以将类别传递给Action的构造函数
public class MyViewController : ViewController {
public MyViewController() {
SimpleAction myAction = new SimpleAction(this, "MyAction", "MyActionCategory");
myAction.ImageName = "Action_SimpleAction";
}
}
Public Class MyViewController
Inherits ViewController
Public Sub New()
Dim myAction As New SimpleAction(Me, "MyAction", "MyActionCategory")
myAction.ImageName = "Action_SimpleAction"
End Sub
End Class
或者,您可以在代码中或在Controller设计器中使用ActionBase.Category属性,或自定义ActionDesign | 模型编辑器中的ActionToContainerMapping节点(请参见将动作放置在其他位置)。
最后,您应该使用自定义模板替换默认模板。编辑应用程序项目的Program.cs(Program.vb)文件并处理XafApplication.CreateCustomTemplate事件。
[STAThread]
static void Main() {
// ...
winApplication.CreateCustomTemplate = delegate(object sender, CreateCustomTemplateEventArgs e) {
if (e.Context == TemplateContext.View) e.Template = new DetailRibbonForm1();
};
// ...
}
<STAThread> _
Shared Sub Main()
' ...
AddHandler winApplication.CreateCustomTemplate, Sub(sender As Object, e As CreateCustomTemplateEventArgs)
If e.Context = TemplateContext.View Then
e.Template = New DetailRibbonForm1()
End If
End Sub
' ...
End Sub
下图说明了结果:
您可以使用如何:本地化WinForms模板主题中描述的方法来本地化此自定义模板。
实施此方法时,请注意以下几点:
在此示例中,假定您使用选项卡式MDI模式MdiShowViewStrategy,这是从解决方案向导创建的任何XAF解决方案的默认设置。在此模式下,可见的功能区元素将从“详细信息功能区表单”和“主功能区表单”模板合并。在其他模式下,可能需要自定义“主功能区”表单,而不是“自定义功能区”表单,或者自定义这两个模板,具体取决于您的特定方案。这是您自定义两个模板时的情况的CreateCustomTemplate事件处理程序的代码。
winApplication.CreateCustomTemplate = delegate(object sender, CreateCustomTemplateEventArgs e) {
if(e.Context == TemplateContext.ApplicationWindow) {
e.Template = new MainRibbonForm1();
}
else if (e.Context == TemplateContext.View) {
e.Template = new DetailRibbonForm1();
}
};
AddHandler winApplication.CreateCustomTemplate, Sub(sender As Object, e As CreateCustomTemplateEventArgs)
If e.Context = TemplateContext.ApplicationWindow Then
e.Template = New MainRibbonForm1()
ElseIf e.Context = TemplateContext.View Then
e.Template = New DetailRibbonForm1()
End If
End Sub
如果应用程序的用户可以使用IModelOptionsWin.FormStyle属性在功能区样式和标准表单样式之间进行选择,则在指定自定义功能区模板之前,您可能需要在CreateCustomTemplate事件处理程序中检查此属性值。
请注意,如果您访问应用程序模型,则需要确保它未设置为null。有关详细信息,请参阅WinApplication.Setup方法在单独的线程中断更改描述中运行。
winApplication.CreateCustomTemplate = delegate(object sender, CreateCustomTemplateEventArgs e) {
if(e.Application.Model != null){
if (((IModelOptionsWin)winApplication.Model.Options).FormStyle == RibbonFormStyle.Ribbon) {
// ...
}
}
};
AddHandler winApplication.CreateCustomTemplate, Sub(sender As Object, e As CreateCustomTemplateEventArgs)
If e.Application.Model IsNot Nothing Then
If DirectCast(winApplication.Model.Options, IModelOptionsWin).FormStyle = RibbonFormStyle.Ribbon Then
' ...
End If
End If
End Sub
如果您的XAF应用程序是在14.2之前的版本中创建的,然后进行了升级,请确保将WinApplication.UseOldTemplates属性设置为false。