建立可扩展的silverlight 应用框架 step-6
时间:2022-04-22
本文章向大家介绍建立可扩展的silverlight 应用框架 step-6,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
整理导航模块“LeftNav”
首先说一下我想要实现的效果。
我希望在左侧的导航点击了以后右侧的主体部分发声变化。
之前我在LeftNav模块用的控件是ToggleButton并为其制作了样式。本来想的是自己根据ToggleButton作为基础自己在做一个复合控件出来。不过这里做导航的话,ListBox会更加的适合些。ListBox的样式制作和之前的ToggleButton样式制作大同小异,都是一个原则:各个VisualStateGroup中的视图状态是可以共存的,VisualStateGroup内部的视图状态只能同时出现一个,尽量不要在多个VisualStateGroup同时改变同一个元素的属性。
下来导航模块“LeftNav”需要从外部加载导航配置文件文件"Nav.xml",将其获得的数据解析并于ListBox做数据绑定。要完成上诉的工作就需要引入Services模块,将各个功能分离开、各司其职。
Nav.xml:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<module showname="Hello Prism" xapname="OperatingTableTestModule" ViewType="OperatingTableTestModule.Views.HelloPrismView, OperatingTableTestModule, Version=1.0.0.0" />
<module showname="欢迎" xapname="OTWelcomeModule" ViewType="OTWelcomeModule.Views.OTWelcomeView, OTWelcomeModule, Version=1.0.0.0" />
<module showname="CGArt" xapname="OTCGArtModule" ViewType="OT.SL.CGArt2010.Style.Issue._31.Views.OTCGArtView, OT.SL.CGArt2010.Style.Issue.31, Version=1.0.0.0" />
<module showname="妄摄写真" xapname="OTMosatsu" ViewType="OTMosatsu.Views.OTMosatsuView, OTMosatsu, Version=1.0.0.0" />
</root>
这里先定义一个导航的实体类,“LdModule”
namespace OTLeftNavModule.Entities
{
public class LdModule
{
//显示名称
public string showname { get; set; }
//View类别
public string ViewType { get; set; }
//Module的名称
public string xapname { get; set; }
}
}
service获取数据并解析
namespace OTLeftNavModule.Services
{
public interface ILeftNavService
{
void RetrievLdModules(Action<IEnumerable<LdModule>> RetrievLdModulesCallBack);
}
}
namespace OTLeftNavModule.Services
{
public class LeftNavService : ILeftNavService
{
#region ILeftNavService Members
/// <summary>
/// 回调函数,用来介绍返回的LdModule
/// </summary>
/// <param name="RetrievLdModulesCallBack"></param>
public void RetrievLdModules(Action<IEnumerable<LdModule>> RetrievLdModulesCallBack)
{
var uri = new Uri(HtmlPage.Document.DocumentUri, "Nav.xml");
WebClient wb = new WebClient();
wb.DownloadStringCompleted += (sender, e) => RetrievLdModulesCallBack(BuildLdModules(e));
wb.DownloadStringAsync(uri);
}
/// <summary>
/// 解析XML
/// </summary>
/// <param name="e"></param>
/// <returns></returns>
private IEnumerable<LdModule> BuildLdModules(DownloadStringCompletedEventArgs e)
{
if (e.Error != null)
{
return new List<LdModule> { new LdModule() { showname = "error", ViewType = "error" } };
}
XDocument xmlLdModules = XDocument.Parse(e.Result);
var ldmodules = from module in xmlLdModules.Descendants("module")
select new LdModule
{
showname = (string)module.Attribute("showname"),
ViewType = (string)module.Attribute("ViewType"),
xapname = (string)module.Attribute("xapname")
};
return ldmodules;
}
#endregion
}
}
将获取的数据赋给Model类用来做数据绑定
namespace OTLeftNavModule.Models
{
public class LeftNavModel : INotifyPropertyChanged
{
ILeftNavService leftNavService;
public LeftNavModel(ILeftNavService leftNavService)
{
ldModules = new ObservableCollection<LdModule>();
this.leftNavService = leftNavService;
this.leftNavService.RetrievLdModules(OnRetrievLdModulesComplete);
}
/// <summary>
/// 回调函数,为ldModules赋值
/// </summary>
/// <param name="newLdModules"></param>
private void OnRetrievLdModulesComplete(IEnumerable<LdModule> newLdModules)
{
this.ldModules.Clear();
foreach (var module in newLdModules)
{
this.ldModules.Add(module);
}
}
public ObservableCollection<LdModule> ldModules
{
get;
private set;
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
}
在Xaml里做绑定
<ListBox Background="{x:Null}" x:Name="ListNav" BorderBrush="{x:Null}" ItemsSource="{Binding ldModules}" Foreground="Black" Style="{StaticResource NavListBoxStyle}" BorderThickness="0" ItemContainerStyle="{StaticResource NavListBoxItemStyle}" FontSize="13.333" Cursor="Hand" Margin="0,2,0,0">
<ListBox.ItemTemplate>
<DataTemplate><TextBlock Text="{Binding showname}"/></DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
最后需要替换右侧的主体Module了,我研究了Composite的Module模块、了解了Module生命周期。需要做到替换主体部分的思路就是先从主体区域得到当前Module,将其移除再载入新的Module。这样会比较适合我当前的项目。
void ListNav_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
LdModule model = ListNav.SelectedItem as LdModule;
//获取选中模块View的类型
Type viewType = Type.GetType(model.ViewType, false);
//是否增加被加载过
if (viewType != null)
{
var resolveView = this.container.Resolve(viewType);
IRegion mainRegion = this.regionManager.Regions["MainRegion"];
//获取主体当前的View
object view = mainRegion.GetView("mainCurrView");
//移除
if (view != null)
mainRegion.Remove(view);
//载入新的View
mainRegion.Add(resolveView, "mainCurrView");
}
else
{
//新加载Module并自动替换当前视图
moduleManager.LoadModule(model.xapname);
}
}
- Visual Studio 2015 前端开发工作流
- 易学易用的Windows PowerShell
- mongodb-java-driver基本用法
- 基于Redis的开源分布式服务Codis
- 利用Weblogic的iisproxy、iisforward插件实现IIS转发
- 帆软FineReport如何使用程序数据集
- etcd:用于服务发现的键值存储系统
- 如何使用HTTP压缩优化服务器
- "org.jboss.netty.internal.LoggerConfigurator".DESCRIBED is already registered 的解决办法
- ASP.NET SignalR 高可用设计
- JavaScript 和asp.net配合编码字符串
- 3D游戏开发之UE4中的集合:TSet容器
- weblogic启动失败:Could not obtain the localhost address 解决办法
- 如何理解云计算?很简单,就像吃货想吃披萨了……
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- linux下分割和合并压缩包
- 编译.net .net Core程序 代码,仅做备份
- js删除数组对象中符合条件的数据
- .net core webapi jwt 更为清爽的认证 ,续期很简单(2)
- 手把手教你写一个windows服务 【基于.net】 附实用小工具{注册服务/开启服务/停止服务/删除服务}
- 一网打尽枚举操作 .net core
- Jenkins 发布.net core 程序,服务端无法下载nuget包的解决方法 error NU1102: 找不到版本为 (>= 3.1.6) 的包
- NET Core Kestrel部署HTTPS 一个服务器绑一个证书 一个服务器绑多个证书
- .net core webapi jwt 更为清爽的认证 ,续期很简单(1)
- 用flask来在线管理你的iptables
- Linux Shell命令速查表
- Windows10实现滑动锁屏
- Vue&uni-app在微信浏览器隐藏titleNView的一个方法
- 使用OData服务将SAP C4C自定义BO的TextCollection暴露给外部消费者
- 如何在SAP C4C AdvancedListPane上批量执行若干BO实例的action