商信互联
XAF提供了WinForms应用程序的两种表单样式:Standard和Ribbon。可以使用“选项”节点的IModelOptionsWin.FormStyle属性选择应用程序的表单样式。本示例演示如何修改Standard表单样式的默认模板-创建一个主菜单项并将一个Action放入其中。如果您的FormStyle是Ribbon,请参考如何:创建自定义WinForms Ribbon模板一文。
DevExpress代码示例数据库(http://www.devexpress.com/example=T196002)中提供了完整的示例项目。
请考虑以下“视图”菜单上的“操作” :
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
默认情况下,您只能将操作放入现有的预定义菜单中。下面的步骤演示了如何将该操作放置在菜单栏中的自定义位置。
在详细信息表单设计器的主菜单栏中,单击[添加]按钮,然后选择菜单(BarSubItem)。然后,为新菜单命名,例如“我的动作”。
您可以使用嵌套的BarSubItem项目创建复杂的子菜单层次结构。
打开新创建的菜单,单击[添加]按钮,然后选择Inplace LinkContainer(BarLinkContainerExItem)。命名链接容器。主容器通常以其菜单命名。将其命名为“我的动作”。
您还可以将操作容器添加到状态栏。在详细信息表单设计器的状态栏菜单中,单击[添加]按钮,然后选择Inplace Link Container(BarLinkContainerExItem)。然后,为新的链接容器指定标题,例如“我的状态操作”。
在设计器的底部,聚焦barManager控件,单击其智能标记,然后选择“运行设计器”。
结果,将调用XAF BarManager Designer(Bar Manager Designer的XAF特定扩展)。在设计器左侧的导航面板中,选择XAF Action Controls | XAF。“操作容器”页面。要从链接容器创建动作容器,请将“我的动作”项从“条形容器控件”列表中拖到“动作容器”中。之后,关闭设计器。
如果您还想将动作容器放置到状态栏,请将“我的状态动作”项从“栏容器控制”列表中拖到“动作容器”。
在创建的菜单中更改要放置的操作的类别。使用在第3步中指定的相同值(例如My Actions)。如果您的Action是用代码创建的,则可以将类别传递给Action的构造函数。
public class MyViewController : ViewController {
public MyViewController() {
SimpleAction myAction = new SimpleAction(this, "MyAction", "My Actions");
myAction.ImageName = "Action_SimpleAction";
}
}
Public Class MyViewController
Inherits ViewController
Public Sub New()
Dim myAction As New SimpleAction(Me, "MyAction", "My Actions")
myAction.ImageName = "Action_SimpleAction"
End Sub
End Class
或者,您可以在代码中或在Controller设计器中使用ActionBase.Category属性,也可以在IModelAction.Category属性或ActionsDesign | XML中使用ActionBase.Category属性。动作| 模型编辑器中的MyAction节点。
最后,您应该使用自定义模板替换默认模板。编辑应用程序项目的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 DetailForm1();
};
// ...
}
<STAThread> _
Shared Sub Main()
' ...
AddHandler winApplication.CreateCustomTemplate, Sub(sender As Object, e As CreateCustomTemplateEventArgs)
If e.Context = TemplateContext.View Then
e.Template = New DetailForm1()
End If
End Sub
' ...
End Sub
下图说明了结果。
您可以使用如何:本地化WinForms模板主题中描述的方法来本地化此自定义模板。
实施此方法时,请注意以下几点:
在此示例中,假定您使用选项卡式MDI模式MdiShowViewStrategy,这是从“解决方案向导”创建的任何XAF解决方案的默认设置。在此模式下,可见的条形菜单元素从“详细信息表单”和“主表单”模板合并。在其他模式下,可能需要自定义“主要表单”而不是“详细信息表单”,或者自定义这两个模板,具体取决于您的特定方案。要创建自定义的主窗体,请使用不推荐使用的模板|。用于创建MainForm1的Main Form Template模板(该过程类似于上述过程)。然后,使用CreateCustomTemplate事件处理程序的以下代码。
winApplication.CreateCustomTemplate = delegate(object sender, CreateCustomTemplateEventArgs e) {
if(e.Context == TemplateContext.ApplicationWindow) {
e.Template = new MainForm1();
}
else if (e.Context == TemplateContext.View) {
e.Template = new DetailForm1();
}
};
AddHandler winApplication.CreateCustomTemplate, Sub(sender As Object, e As CreateCustomTemplateEventArgs)
If e.Context = TemplateContext.ApplicationWindow Then
e.Template = New MainForm1()
ElseIf e.Context = TemplateContext.View Then
e.Template = New DetailForm1()
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.Standard) {
// ...
}
}
};
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.Standard Then
' ...
End If
End If
End Sub