下面就是小编给大家带来的Silverlight实例教程 Out of Browser与Office的互操作,本文共5篇,希望大家喜欢阅读!
篇1:Silverlight实例教程 Out of Browser与Office的互操作
在本篇开始前,首先感谢每一位留下反馈评论的朋友,在我看来,博客不仅仅是简单的分享,同时也 是一个学习和发现的过程,在阅读完一篇文章能对其有所评论和提问,也是一种思考的表现。
在上篇“Silverlight实例教程 - Out of Browser与COM的交互基础” 中,我们讨论了Silverlight的 OOB应用访问COM组件基础知识,在大家的反馈中,有不少朋友提出疑问,Silverlight对于COM的支持,使 其失去跨平台的优越性,另外,Silverlight仅有Out of Browser模式能支持COM,是否仍旧存在较大的局 限性? 对此在本篇我们不进行长篇分析和讨论,只是简单的把我的看法说一下。
Silverlight Out of Browser从Silverlight 3 到现在Silverlight 4,一直遵循跨平台的原则,在微 软官方有相关的解释,
Linux,Moonlight从第一个版本发布,就已经有了高级权限模型,在GtkWidget中Moonlight具有full -trust的能力。也就是说,Silverlight具有信任权限提升,而Mono具有full-trust模式。
Mac,由于Mac没有Com的概念,所以,Silverlight的COM无法在Mac中运行,但是微软官方也正在寻找 一种方式,尝试使用一种模拟的方式来实现在Mac上运行COM的效果,例如,运行AppleScript
在上面的脚本中可以看出,Mac如何通过AppleScript来调用Office Word的,而这样的方式其实也就是 Mac对COM的调用,在以后Silverlight的版本中,如果加入对AppleScripts的支持即可在Mac上支持COM的 运行;
从上面的描述来看,Silverlight的OOB应用跨平台,并非不能解决,只是时间的问题。作为技术人员 ,经常对一门技术的前景进行展望,而需要注意的是,尽量不要使用其短处与其他技术的长处进行相比较 ,这样的对比结果,只会干扰自己的视线和思路。一门能挣钱的技术,就已经算是一门好技术了。
Out of Browser与Office的互操作
言归正传,本篇将继续介绍Silverlight的Out of Browser应用与Office COM组件的交互。相信大家对 微软的Office系列并不陌生了,Office在企业项目中使用频率较高,例如在日常项目中经常与遇到导出列 表到 Excel,或者发送邮件等功能需求,所以微软将其许多功能封装成COM组件,供开发人员使用,增强 其应用的灵活性。本篇,我将演示在Silverlight的OOB应用中,如何使用Office Outlook,Word,Excel 组件。
我们仍旧使用上篇的项目代码,对其进行扩展,大家可以到上篇下载演示项目代码。
在开始功能代码前,首先需要在UI界面ToolBar中添加三个Button来响应其事件。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
对与三个应用分别添加其Click事件代码。首先,我们先看看OutLook的COM调用,
1 private void sendemailBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic utlook = AutomationFactory.CreateObject (“Outlook.Application”))
4 {
5 dynamic mail = outlook.CreateItem(0);
6 mail.To = “qq34506@hotmail”;
7 mail.Subject = “来自jv9的问候”;
8 mail.HTMLBody = “这封邮件是通过Silverlight发送 的.”;
9 mail.Send;
10 //mail.Display(); 这里是显示出发送邮件的Outlook窗口
11 }
12 }
在建立Outlook实例后,我们可以使用Outlook.CreateItem来创建新的邮件实例,其中可以简单的设置 发送目的邮箱,标题,内容等。在代码后面有mail.Send和Display两个方法。其中如果调用Display, Silverlight会激活Outlook创建邮件窗口,然后用户确认后发送邮件到目的邮箱。例如:
而调用mail.Send则会直接发送邮件到目的邮箱。而通常来说,我们建议使用mail.Display,让用户确 认后再发送。
Silverlight操作 Office Word
Silverlight操作Office Word比较简单,首先我们添加Word的相应事件:
1 private void wordBtn_Click(object sender, RoutedEventArgs e)
2 {
3 dynamic word = AutomationFactory.CreateObject (“Word.Application”);
4 word.Visible = true;
5 dynamic doc = word.Documents.Add();
6
7 string Insertxt = “这是Silverlight操作Office Word测试。欢迎大家访问我的博 客 jv9blogs”;
8 dynamic range = doc.Range (0, 0);
9
10 range.Text = Insertxt;
11 }
在创建Word实例后,使用Documents.Add创建一个新的空文档,然后,添加相关文档或者 图片到Word中。其运行效果如下:
Silverlight操作Office Excel
相对上面两个Office组件来讲,Excel的使用较为复杂一点,这里我们来详细演示Silverlight导出 Excel的实例。
操作Excel不可缺少的是数据库,作为演示实例,我使用Blend 4创建简单的数据集合,使用Blend创建 例程数据集合,我曾经在Blend实例系列中讲过,这里我将简单的演示,
首先使用Blend 4打开当前SilverlightOOBDemo项目,然后在右边属性栏,选择Data,
这时会提示输入SampleDataSource名称:
点击OK后,Blend 4将自动生成一个数据集合。
由于是Blend 4自动生成的,其中的String和Number都是随机生成的,这些对于演示实例已经足够了。
当SampleDataSource创建完成后,在SliverlightOOBDemo项目中,会创建一个SampleData目录,其中 包含了我们定义的数据源,
现在,需要在UI中创建一个Datagrid的控件,然后拖动右边Data下SampleDataSource1下的Collection 到Datagrid,进行数据绑定,这里我仍旧使用了Blend 4,所有控件和数据绑定,都是简单的拖动即可实 现。
1
2
3
4
5
6
7
8
以上设置,我们添加了Sample数据源,并且绑定数据到指定datagrid中,现在,可以设计Excel组件调 用代码,
1 bool firstTime = true;
2 public ObservableCollection
3 private void excelBtn_Click(object sender, RoutedEventArgs e)
4 {
5 dynamic excel = AutomationFactory.CreateObject (“Excel.Application”);
6 excel.Visible = true;
7 dynamic workbook = excel.workbooks;
8 workbook.Add();
9 dynamic sheet = excel.ActiveSheet;
10 dynamic cell = null;
11 int i = 1;
12 // 将数据传输到Excel
13 foreach (Item item in dgDemo.ItemsSource)
14 {
15 itemCollection.Add(item);
16 cell = sheet.Cells[i, 1]; // 列和行
17 cell.Value = item.Property1;
18 cell.ColumnWidth = 25;
19
20 cell = sheet.Cells[i, 2];
21 cell.Value = item.Property3;
22 i++;
23 }
24
25 }
在上面代码中,声明一个Excel实例,然后通过循环输入数据源到Excel实例Sheet中,从代码中我们可 以看出,输出Excel是通过Cell进行操作的,
这里,我仅输出了Property1和Property3两列。这样就简单的实现了输出Datagrid的数据到Excel了。
现在我们对当前的输出Excel进行一些强化,输入一个图表功能。
对我们当前的代码进行简单的修改,添加如下代码:
1 bool firstTime = true;
2 public ObservableCollection
3 private void excelBtn_Click(object sender, RoutedEventArgs e)
4 {
5 dynamic excel = AutomationFactory.CreateObject (“Excel.Application”);
6 excel.Visible = true;
7 dynamic workbook = excel.workbooks;
8 workbook.Add();
9 dynamic sheet = excel.ActiveSheet;
10 dynamic cell = null;
11 int i = 1;
12 // 将数据传输到Excel
13 foreach (Item item in dgDemo.ItemsSource)
14 {
15 itemCollection.Add(item);
16 cell = sheet.Cells[i, 1]; // 列和行
17 cell.Value = item.Property1;
18 cell.ColumnWidth = 25;
19
20 cell = sheet.Cells[i, 2];
21 cell.Value = item.Property3;
22 i++;
23 }
24
25 // 创建一个例程图表
26 dynamic sheetShapes = sheet.Shapes;
27 sheetShapes.AddChart(-4100, 200, 2, 400, 300);
28
29 }
sheepShapes.AddChart创建一个新的图表效果,其数据是绑定的dynamic sheet = excel.ActiveSheet
这样当我们再次运行输出Excel时,即可得到如下结果:
这些功能的实现,完全是调用了Excel中提供的组件功能。
下面我们更进一步的完善Excel输入功能,添加自动绑定更新事件。其目的是为了实现,当用户输出 Excel后,修改Excel中数据,Silverlight的OOB应用中Datagrid同时也更新修改对应数据。
实现该需求,需要用到Excel的SheetChange事件。当用户修改Excel中内容时,即激活该事件。首先, 我们需要修改以上代码,
1 bool firstTime = true;
2 public ObservableCollection
3 private void excelBtn_Click(object sender, RoutedEventArgs e)
4 {
5 dynamic excel = AutomationFactory.CreateObject (“Excel.Application”);
6 excel.Visible = true;
7 dynamic workbook = excel.workbooks;
8 workbook.Add();
9 dynamic sheet = excel.ActiveSheet;
10 dynamic cell = null;
11 int i = 1;
12 // 将数据传输到Excel
13 foreach (Item item in dgDemo.ItemsSource)
14 {
15 itemCollection.Add(item);
16 cell = sheet.Cells[i, 1]; // 列和行
17 cell.Value = item.Property1;
18 cell.ColumnWidth = 25;
19
20 cell = sheet.Cells[i, 2];
21 cell.Value = item.Property3;
22 i++;
23 }
24
25 // 创建一个例程图表
26 dynamic sheetShapes = sheet.Shapes;
27 sheetShapes.AddChart(-4100, 200, 2, 400, 300);
28
29 // 更新事件
30 if (firstTime)
31 {
32 excel.SheetChange += new SheetChangedDelegate (SheetChangedEventHandler);
33 string sheetName = sheet.Name;
34
35 firstTime = false;
36 }
37
38 }
为了完成SheetChange,我们需要添加相关事件委托。
1 delegate void SheetChangedDelegate(dynamic excelSheet, dynamic rangeArgs);
其具体事件响应Handler为:
1 private void SheetChangedEventHandler(dynamic excelSheet, dynamic rangeArgs)
2 {
3 dynamic sheet = excelSheet;
4 string sheetName = sheet.Name;
5 dynamic range = rangeArgs;
6 dynamic rowValue = range.Row;
7 ObservableCollection
8 Item[] newEntities = new Item[10];
9
10 dynamic col2range = sheet.Range(“B1:B10”);
11
12 for (int i = 0; i < 10; i++)
13 {
14 Item newEntity = new Item();
15 newEntity.Property1 = entities[i].Property1;
16 newEntity.Property2 = entities[i].Property2;
17
18 dynamic item = col2range.Item(i + 1);
19 newEntity.Property3 = Convert.ToInt32 (item.Value);
20
21 newEntities[i] = newEntity;
22 }
23 dgDemo.ItemsSource = newEntities;
24 dgDemo.SelectedIndex = Convert.ToInt32(rowValue) - 1;
25 }
这里,我设置操作sheet范围为B1:B10,仅处理这个区域表格中数据绑定,而当excel中数据变化,则 会查找对应表格到Datagrid的表格中进行更新。
其运行效果,当用户修改Excel中的B1-B10中的数据,同时Datagrid会产生更新,并且Excel图表也会 产生更新效果。
上述介绍了Silverlight 4调用Office COM的具体方法,以及常用功能,大家可以在这个基础上进行扩 展,将其应用于自己的应用中。
随文源码:www.bianceng/dotnet/12/674.htm
篇2:Silverlight实例教程 Out of Browser与COM互操作实例
在前面已经介绍了Silverlight的Out of Browser模式与COM的基本操作以及与Office COM的交互,这 篇我们将介绍更多Silverlight Out of Brwoser的COM实例。
我们将继续使用过去的SilverlightOOBDemo项目进行简单扩展。
实例1:演示Silverlight与DOS的交互,对于Windows API熟悉的朋友应该了解,使 用WShell可以运行任何Dos命令。
1 private void dosBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic shell = AutomationFactory.CreateObject(“WScript.Shell”))
4 {
5 //shell.Run(@“cmd /k dir /w /p”);
6 shell.Run(@“cmd /k ping wwwblogs -t”);
7 }
8
9 }
实例2:使用WShell API模拟用户输入实例。使用WShell的SendKeys可以模拟用户 输入效果到应用程序中,并且可以模拟一些特殊键功能,例如,回车,Tab,Ctrl等按键。
其中要实现模拟输入代码如下:
1 private void inputBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic shell = AutomationFactory.CreateObject(“WScript.Shell”))
4 {
5 shell.Run(@“c:\windows\notepad.exe”);
6 shell.SendKeys(“my blog:{Enter}jv9blogs”);
7 }
8 }
实例3:Silverlight OOB应用读取注册表信息实例
使用Shell.Application的RegRead方法可以读取本地注册表键值,例如,读取 “HKLM\Software\Microsoft\ASP.NET\RootVer”,.Net Framework的版本。
1 private void regBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic WShell = AutomationFactory.CreateObject(“WScript.Shell”))
4 {
5 string reg = WShell.RegRead (@“HKLM\Software\Microsoft\ASP.NET\RootVer”);
6 MessageBox.Show(“.Net Framework Root Version: ” + reg);
7 }
8 }
读取结果:
实例4:使用Shell.Application的RegWrite方法可以对注册表进行写操作。这个实 例将实现添加Silverlight Out of Browser应用到Windows启动项。
1 private void regWriteBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic ShellApplication = AutomationFactory.CreateObject (“Shell.Application”))
4 {
5 dynamic commonPrograms = ShellApplication.NameSpace(11);
6 string allUsersPath = commonPrograms.Self.Path;
7
8 dynamic directory = ShellApplication.NameSpace(allUsersPath + @“\Programs”);
9 dynamic link = directory.ParseName(Deployment.Current.OutOfBrowserSettings.ShortName + “.lnk”);
10 string OBLink = link.Path;
11
12 using (dynamic WShell = AutomationFactory.CreateObject(“WScript.Shell”))
13 {
14 WShell.RegWrite (@“HKLM\Software\Microsoft\Windows\CurrentVersion\Run\”
15 + Deployment.Current.OutOfBrowserSettings.ShortName,
16 OOBLink);
17 MessageBox.Show(“请重启你的机器,你的应用将被自动载入启动列表.”);
18 }
19 }
20 }
当运行以上代码后,应用会将OOB应用快捷方式写入注册表 HKLM\Software\Microsoft\Windows\CurrentVersion\Run\
应用程序将在下次重启后,自动启动,
实例5:使用Windows 7 API实现锁定应用到Windows 7任务栏
在Windows 7中使用Shell.Application类库允许遍历应用,检查Verbs进行应用锁定。
1 private void pinBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic ShellApplication = AutomationFactory.CreateObject (“Shell.Application”))
4 {
5 dynamic commonPrograms = ShellApplication.NameSpace(23);
6 string allUsersPath = commonPrograms.Self.Path;
7
8 dynamic directory = ShellApplication.NameSpace(allUsersPath + @“\Accessories”);
9 dynamic link = directory.ParseName(“Calculator.lnk”);
10
11 dynamic verbs = link.Verbs();
12 for (int i = 0; i < verbs.Count(); i++)
13 {
14 dynamic verb = verbs.Item(i);
15 if (verb.Name.Replace(@“&”, string.Empty).ToLower() == “pin to taskbar”)
16 {
17 verb.DoIt();
18 }
19 }
20 }
21 }
当执行以上代码后,获取计算器应用快捷方式,然后执行“Pin to Taskbar”后,将应用锁定在 Windows 7任务栏。
实例6:Silverlight Out of Browser语音阅读实例
使用Windows自带的Speech API中的SAPI引擎SpVoice类可以实现语音阅读功能。
1 private void speechBtn_Click(object sender, RoutedEventArgs e)
2 {
3 using (dynamic ISpeechVoice = AutomationFactory.CreateObject(“SAPI.SpVoice”))
4 {
5 ISpeechVoice.Volume = 100;
6 ISpeechVoice.Speak(“ Hello everyone! Welcome to my blog,jv9blogs”); 7 } 8 }
当运行以上代码后,会听到以上阅读内容。
对于Silverlight Out of Browser的COM应用有一款开 源项目COM Toolkit,该控件在OOB模式下可以对本地数据库进行操作,推荐大家参考学习。
今天就写到这里了,希望能对大家有所帮助。
随文源码:www.bianceng/dotnet/201212/673.htm
篇3:Silverlight实例教程 Out of Browser音乐播放器
在上一篇,我们了解了如何在Silverlight的Out of Browser模式下进行Debug调试,另外学习Silverlight OOB应用的一个新特性Notifications窗口,本篇,我们将结合以往的Out of Browser特性, 创建一款新的Out of Browser实例, 音乐播放器。 该实例目的比较简单,实现音乐播放,实现音乐文件 列表读取,实现音乐文件信息读取,另外音乐播放自动跳转等功能。
在实例开始前,我们仍旧需要了解一些基础知识。Silverlight对音频的支持是使用MediaElement类, 该类使用方法非常简单,该类的详细解释,请看MSDN
1
2 x:Name=“media”
3 Source=“xbox.wmv”
4 CurrentStateChanged=“media_state_changed”
5 Width=“300” Height=“300”/>
在了解了音频播放类的简单使用后,让我们先看看项目完成后的效果图,
从上面效果图中可以看出整个实例项目UI分5个部分,
1. 音频控制部分,这部分是实例主要功能;
2. 音频文件信息部分,这部分是获取显示当前和下一首音乐文件信息;
3. 唱片图片信息,其实这部分也是属于音频文件信息,不过这里单独列出来,使用独立的类进行处理 ;
4. 音频文件列表,该列表是载入My Music目录中的音乐文件,并支持用户选择播放功能;
5. UI控制,该部分可以使播放器进入最小化状态。例如:
下面我们开始分别解释以上几个部分的实例设计方法。
我们仍旧使用SilverlightOOBDemo项目,不过为了使代码更清晰易读,这次不再使用 OutofBrowserMainPage作为OOB应用主界面,我们重新创建一个新的OOB应用界面 OutofBrowserMusicPlayer。
为了修改启动页面为OutofBrowserMusicPlayer,为此,我们需要修改App.xaml中的启动页面代 码:
1 private void Application_Startup(object sender, StartupEventArgs e)
2 {
3 if (!Application.Current.IsRunningOutOfBrowser)
4 {
5 this.RootVisual = new MainPage;
6 }
7 else
8 {
9 //this.RootVisual = new OutofBrowserMainPage ();
10this.RootVisual = new OutofBrowserMusicPlayer ();
11 }
12
13 }
根据实例需求,我们最主要的功能就是播放音乐,所以,我们第一步首先实现Out of Browser应用音 频控制。
1. 创建自定义音频控制控件;
对于音频控制,这里我们使用了自定义控件控制音乐的播放。AudioControl.xaml控件,
这里我仅贴上部分代码,大家可以在文章最后下载完整源代码。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
从以上代码可以看到,在AudioControl中有两个自定义控件local:MediaSlider和local:Spinner。
MediaSlider:
其功能是控制音乐播放进度,支持拖拽前进或者后退音乐播放进度。其代码如下:
1 public class MediaSlider : Slider
2 {
3 public Thumb horizontalThumb;
4 private FrameworkElement horizontalLeftTrack;
5 private FrameworkElement horizontalRightTrack;
6 private double ldValue = 0, newValue = 0, prevNewValue = 0;
7 public event RoutedPropertyChangedEventHandler
8 public event RoutedPropertyChangedEventHandler
9 private DispatcherTimer dragtimer = new DispatcherTimer ();
10 private double dragTimeElapsed = 0;
11 private const short DragWaitThreshold = 200, DragWaitInterval = 100;
12 public Rectangle progressRect = null;
13 private bool dragSeekJustFired = false;
14
15 public MediaSlider()
16 {
17
18 this.ValueChanged += new RoutedPropertyChangedEventHandler
19 dragtimer.Interval = new TimeSpan(0, 0, 0, 0, DragWaitInterval);
20 dragtimer.Tick += new EventHandler(dragtimer_Tick);
21 }
22
23 void dragtimer_Tick(object sender, EventArgs e)
24 {
25 dragTimeElapsed += DragWaitInterval;
26
27 if (dragTimeElapsed >= DragWaitThreshold)
28 {
29 RoutedPropertyChangedEventHandler
30
31 if ((handler != null) && (newValue != prevNewValue))
32 {
33 handler(this, new RoutedPropertyChangedEventArgs
34 dragSeekJustFired = true;
35 prevNewValue = newValue;
36 }
37
38 dragTimeElapsed = 0;
39 }
40 }
41
42 void CustomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs
43 {
44 ldValue = e.OldValue;
45 newValue = e.NewValue;
46
47 if (horizontalThumb.IsDragging)
48 {
49 dragTimeElapsed = 0;
50 dragtimer.Stop();
51 dragtimer.Start();
52 dragSeekJustFired = false;
53 }
54 }
55
56 public override void OnApplyTemplate()
57 {
58 base.OnApplyTemplate();
59
60 horizontalThumb = GetTemplateChild(“HorizontalThumb”) as Thumb;
61 horizontalLeftTrack = GetTemplateChild(“LeftTrack”) as FrameworkElement;
62 horizontalRightTrack = GetTemplateChild(“RightTrack”) as FrameworkElement;
63 progressRect = GetTemplateChild(“Progress”) as Rectangle;
64
65 if (horizontalLeftTrack != null) horizontalLeftTrack.MouseLeftButtonDown += new MouseButtonEventHandler (OnMoveThumbToMouse);
66
67 if (horizontalRightTrack != null) horizontalRightTrack.MouseLeftButtonDown += new MouseButtonEventHandler (OnMoveThumbToMouse);
68
69 horizontalThumb.DragCompleted += new DragCompletedEventHandler(DragCompleted);
70
71 progressRect.Width = this.Width;
72 }
73
74 public Storyboard ProgressStoryboard { get { return (GetTemplateChild(“ProgressStoryboard”) as Storyboard); } }
75
76 public Rectangle ProgressBar { get { return (GetTemplateChild(“Progress”) as Rectangle); } }
77
78 protected override Size ArrangeOverride(Size finalSize)
79 {
80 Size s = base.ArrangeOverride(finalSize);
81
82 if (double.IsNaN(horizontalThumb.Width) && (horizontalThumb.ActualWidth != 0))
83 {
84 horizontalThumb.Width = horizontalThumb.ActualWidth;
85 }
86
87 if (double.IsNaN(horizontalThumb.Height) && (horizontalThumb.ActualHeight != 0))
88 {
89 horizontalThumb.Height = horizontalThumb.ActualHeight;
90 }
91
92 if (double.IsNaN(horizontalThumb.Width)) horizontalThumb.Width = horizontalThumb.Height;
93 if (double.IsNaN(horizontalThumb.Height)) horizontalThumb.Height = horizontalThumb.Width;
94
95 return (s);
96 }
97
98 private void OnMoveThumbToMouse(object sender, MouseButtonEventArgs e)
99 {
100 e.Handled = true;
101 Point p = e.GetPosition(this);
102
103 if (this.Orientation == Orientation.Horizontal)
104 {
105 Value = (p.X - (horizontalThumb.ActualWidth / 2)) / (ActualWidth - horizontalThumb.ActualWidth) * Maximum;
106 }
107
108 RoutedPropertyChangedEventHandler
109
110 if (handler != null)
111 {
112 handler(this, new RoutedPropertyChangedEventArgs
113 }
114 }
115
116 private void DragCompleted(object sender, DragCompletedEventArgs e)
117 {
118 dragtimer.Stop();
119 dragTimeElapsed = 0;
120
121 RoutedPropertyChangedEventHandler
122
123 if ((handler != null) && (!dragSeekJustFired))
124 {
125 handler(this, new RoutedPropertyChangedEventArgs
126 }
127 }
128 }
而Spinner控件,是一个载入标识,当音频载入时,会显示该控件,
该控件为Path绘制的控件,这里不 再贴出代码描述。
2. 获取音频文件信息部分
该部分我们同样也创建一个自定义控件来实现,TrackInfo.xaml,主要是负责在客户端显示音频文件 的信息,而Silverlight没有相关API可以实现读取音频文件的标签信息,这里,我们需要引入一个微软开 源类库TagLib。该类库的主要功能就是读取和修改音乐文件的标签信息。
其调用方法非常简单:
1 // 获取标签
2 tags = TagLib.File.Create(MediaFile.ID);
3 // 设置标签属性
4 MediaFile.Artist = tags.Tag.FirstPerformer;
5 MediaFile.Title = tags.Tag.Title;
6 MediaFile.Album = tags.Tag.Album;
7 MediaFile.Genre = tags.Tag.FirstGenre;
当音乐标签信息获取成功后,即可将信息绑定到TrackInfo.DataContext。
3. 唱片图片信息
对于唱片的图片信息,这里需要读取Image从本地目录,当没有唱片图片时,则显示默认Music.png图 片。这里需要注意的是,读取本地文件,需要OOB应用权限信任。
1 public ImageSource AlbumArtStream
2 {
3 get
4 {
5 BitmapImage image;
6
7 if (string.IsNullOrEmpty(AlbumArtPath))
8 {
9 if (null == _default)
10 {
11 _default = new BitmapImage(new Uri(“../Images/Music.png”, UriKind.Relative));
12 }
13
14 image = _default;
15 }
16 else
17 {
18 FileStream stream = File.Open(AlbumArtPath, FileMode.Open, FileAccess.Read);
19
20 image = new BitmapImage();
21 image.SetSource(stream);
22 stream.Close();
23 }
24
25 return image;
26 }
27 }
4. 获取音频文件列表
从演示图片可以看出,我们的音频文件列表,是用了一个绑定了音乐播放文件信息的Datagrid。
其代码非常简单,创建两列,分别绑定歌手和歌曲名:
1
2Grid.Row=“1”
3Grid.Column=“1”
4Grid.RowSpan=“3”
5VerticalAlignment=“Top”
6Margin=“4”
7Height=“296”
8Style=“{StaticResource DataGridStyle}”
9AutoGenerateColumns=“False”
10CanUserResizeColumns=“True”
11CanUserSortColumns=“False”
12 SelectionChanged=“playList_SelectionChanged”>
13
14
15 Binding=“{Binding Artist}”
16 FontSize=“12” />
17
18 Binding=“{Binding Title}”
19 FontSize=“12”
20 Width=“*” />
21
22
而后台,在读取了My Music目录后,将数据集绑定到datagrid.ItemsSource就可以正常实现歌曲列表 了。
1 public static List
2 {
3 List
4 MediaFile mf;
5 string path = Environment.GetFolderPath (Environment.SpecialFolder.MyMusic);
6 IEnumerable
7 TagLib.File tags;
8 files = GetCachedList(list);
9 if (null == files || files.Count == 0)
10 {
11 files = new List
12 foreach (string file in list)
13 {
14 mf = new MediaFile();
15 mf.ID = file;
16 mf.AlbumArtPath = GetAlbumArtPath(file);
17 files.Add(mf);
18 }
19
20 for (int idx = 0; idx < files.Count; idx++)
21 {
22 mf = files[idx];
23 tags = TagLib.File.Create(mf.ID);
24 mf.Artist = tags.Tag.FirstPerformer;
25 mf.Title = tags.Tag.Title;
26 mf.Album = tags.Tag.Album;
27 mf.Genre = tags.Tag.FirstGenre;
28 }
29 SaveCachedList(files);
30 }
31
32 return files;
33 }
在绑定成功后,同时,我们支持用户选择指定音乐播放,使用Datagrid的SelectionChanged事件即可 。
1 private void playList_SelectionChanged(object sender, SelectionChangedEventArgs e)
2 {
3 DataGrid dg = (sender as DataGrid);
4
5 if (dg.SelectedIndex != _nowPlaying)
6 {
7 if (dg.SelectedIndex != 0)
8 {
9 me.AutoPlay = true;
10 }
11 OpenAndPlay(dg.SelectedIndex);
12 }
13
14 }
5. UI控制
对于UI的控制,这里我们只是简单的实现了隐藏和显示音乐信息框的功能,其代码实现:
1 private void Minimize_Click(object sender, MouseButtonEventArgs e)
2 {
3 Window main = Application.Current.MainWindow;
4
5 if (!_min)
6 {
7 main.Height = 40;
8 rot.Angle = 0;
9 }
10 else
11 {
12 main.Height = 340;
13 rot.Angle = 180;
14 }
15
16 _min = !_min;
17 }
上面是OOB音乐播放器5个部分的核心功能代码,这里,我想同时将上一篇讲到的Notifications窗口应 用到实例中,我们可以仍旧使用NotificationControl文件,在其中对播放音乐Title进行绑定,即当音乐 播放完毕后,即弹出消息提示播放下一首“XXX”音乐。效果如下图:
根据上一篇介绍Notifications窗口的代码,我们简单进行修改,即可实现本篇实例需求:
1 NotificationWindow notifyWindow = null;
2 private void ShowToast()
3 {
4 notifyWindow = new NotificationWindow();
5
6 if (notifyWindow.Visibility == Visibility.Visible)
7 notifyWindow.Close();
8
9 NotificationControl myNotify = new NotificationControl ();
10 myNotify.DataContext = _playList[_nowPlaying];
11 notifyWindow.Width = 300;
12 notifyWindow.Height = 100;
13 notifyWindow.Content = myNotify;
14 notifyWindow.Show(10000);
15 }
至此,一款基于Silverlight的Out of Browser模式的音乐播放器基本完成了。大家可以根据该实例添 加更多自定义功能,例如添加互联网音乐播放功能,音乐搜索功能等,创建属于自己的Silverlight版酷 我音乐盒。
随文源码:www.bianceng/dotnet/12/671.htm
篇4:Office文档局部文档操作技巧
Word篇竖向选择聪明的司马光砸缸救人,而没有费时间去找长竹竿捞出伙伴,在Word中似乎所有选择都是横向的,一旦需要删除竖向排列的文字(比如空格、序号等),只能手工一点点操作吗?其实,还真有一种竖向块操作方式,非常快捷。只要按住ALT键,同时按住鼠标左键不放,顺势往下拉,会出现文字反选色块,不费吹灰之力就完成了竖向选择,要删除,要修改,随心所欲。
局部保护防弹背心之所以没有把全身裹住,是为了轻便和节省材料。把Word文档分发给各员工填写资料,一些关键内容被不慎删除的情况时有发生。别担心,我们把关键部分保护起来!选定需要编辑的文本(按住Ctrl键可选中不连续的内容),进入“工具→保护文档”命令,在“编辑限制”的“仅允许在文档中进行此类编辑”列表中选中“未做任何更改(只读)”。如果允许打开文档的任何人编辑所选部分,则选中“组”框中的“每个人”复选框;如果允许特定的个人编辑所选部分,单击“更多用户”,然后输入用户名(可以是 Microsoft Windows 用户账户或电子邮件地址),用分号分隔,确定。最后按下“是,启动强制保护”按钮,输入密码,确定返回即可。穿上保护衣后,如果你没有获得授权,试图对文档进行编辑操作时,在状态栏会出现“不允许修改,因为此文档已经锁定”的提示。如果是允许编辑的人,单击任务窗格底部的“停止保护”按钮(或进入“工具→取消文档保护”命令),输入正确密码,就可以解除锁定了。
局部“分栏” 梅花阵,进可攻,退可守,在文档中,为了版面的美观等需要,不妨摆个梅花阵。有人马上想到“格式→中文版式→纵横混排”,不错,但是我们大多数都习惯于横向排列。比如,一页里有部分内容需要分栏,而一部分不分,如何实现?太简单了!难道“分栏”只对整篇文章起作用?首先把要分栏的段落选中,进入“格式→分栏”,就可以了,如果先不选中,就默认对整个文档进行分栏。此外,利用文本框实现文字的随意排列也非常方便,在其他领域也很实用,比如Excel左上角的斜线表头应用,以及PPT的文字绕图应用等。
Excel篇部分文字玩特效我们认为电脑是万能的,自己的手也是万能的,什么都可以输入电脑,可是当遇到平方、下划线等情况,就犯愁了。比如现在输入单位“kg/m3”,如何把中间的3变成上标?很简单,选中数字3,点击“格式→单元格”,选中“特殊效果”里的“上标”就完成了。看,删除线、下标,以及各种下划线都在这里,是不是以前粗心的自己从未注意过?
局部“捉迷藏” 蜥蜴是聪明的,它懂得通过不断变化的颜色来保护自己。与Word的局部保护相比,Excel的应用更具广泛性,而且无论想把哪里藏起来,都不在话下,
先看看最轻微的“隐身”。选择要隐藏的单元格区域,进入“格式→单元格”,单击“数字”选项卡,在“分类”框中单击“自定义”,然后在“类型”框中键入三个半角的分号“;;;”,确定。好了,单元格中的内容不会显示在工作表中,但当你单击这个单元格后,编辑栏中会显示其内容。如何完全隐身呢?在“保护”选项卡中,选中“隐藏”复选框,确定。然后进入“工具→保护”,单击“保护工作表”,选中“保护工作表及锁定的单元格内容”复选框,还可以在“取消工作表保护时使用的密码”框中键入密码,确定即可。要恢复显示,在“工具→保护”子菜单中单击“撤消工作表保护”就OK。一定要记牢或不用密码,避免不必要的麻烦。还可以把要保护的局部区域的字改为白色,让别人看不到数据,再进行整个工作表的保护。
行列的折叠降落伞不用时收成一个伞包,那么暂时没用的行列能先收起来吗?有时候数据过多,为了把最重要的数据显示在单元格中,可以把行或列隐藏起来。首先任意点击一个单元格,进入“格式→行→隐藏”,这个单元格所在的行就隐藏起来了,隐藏列的方法相似。
还有一种折叠,带有加号,打开后又变成减号,如何实现的呢?选定所要折叠的区域,在“数据”里面选“组及分级显示”(快捷键按Alt+shift+→),可以按行或列分组,也就是折叠起来。点击“取消组合”(或按Alt+shift+←)就能恢复原貌。
PPT篇多个模板灵活用一部好的电影除了有吸引人的开头,通常还有不断变化的剧情、迭起的高潮。做为演示的幻灯片也是如此。如果一张模板到底,一定会让人感觉乏味无比。在powerpoint xp之后的版本中,可以在一个演示文稿中应用任意多个模板,比如用第二个模板来引入一个新的话题或引起观众的注意。选中“视图”菜单下的“任务窗格”,打开“幻灯片设计”任务窗格,在“普通”视图下选中要应用模板的幻灯片(可以按住ctrl键分别选择多个),最后再将鼠标指向任务窗格中自己满意的某个模板,单击右侧的下拉按钮打开菜单,选择其中的“应用于选定幻灯片”即可。
打印篇在《越狱》最精彩的”惊险大逃亡“中,迈克尔和哥哥为了争取时间,取得最后的胜利,“淘汰”了少数兄弟。我们阅读纸质文件更容发现某些不易察觉的错误,所以把电子文档打印出来再反复检查修改十分必要。那么,打印Word文档时是否所有的元素都要打印出来呢?未必,为了加快打印速度,可以按草稿的质量输出打印文档,Word 将不打印格式及大部分图形。在“打印”对话框的“选项”中选中“草稿输出”即可,不过少数打印机不支持此选项。
打印PPT的时候,在“打印”对话框的“打印内容”中选择“幻灯片”(保留格式)、“讲义”(可在一页中打印几张幻灯片)、“备注页”(含有批注的幻灯片)、“大纲视图”(按幻灯片分页的文字)等项目,可以获得不同的打印内容。比如一个PPT,演讲者自己打印时可以保留批注,而给参加培训的人员发的材料,可以把这些无关信息去掉。打印Excel的时候,局部区域、工作表还是工作簿都可以根据需要选择。
篇5:Silverlight实例教程 Out of Browser存取本地文件系统
在前文,我们讲述了Silverlight Out of Browser的基础以及自定义模式应用 ,本篇,我们将讲述Silverlight Out of Browser应用的重点 - 创建可信任应用 ,也称为Trusted Application. 早在Silverlight 3,Silverlight Out of Browser的功能由于权限的限制无法很好的满足用户的正常存取需求,仅能实现将 Web应用脱离浏览器。而在Silverlight 4中,通过提升应用信任权限,大大增强 了Silverlight Out of Browser的功能,在权限允许的情况下,用户可以自由有 访问本地目录,也可以执行本地应用程序,另外通过调用COM组件,实现更多更强 大的本地应用操作。下面我们将实例讲述Silverlight Out of Browser可信任应 用 - 存取本地文件系统。
本篇中,我们将基于上篇教程提供的项目SilverlightOOBDemo进行演示操作。
首先需要确认SilverlightOOBDemo项目允许用户提升应用信任权限。这样, OOB应用将被允许访问用户本地资源。
Silverlight 4对于本地文件夹的存取,并非代表存取所有本地磁盘目录,目 前为止,Silverlight 4 API仅支持存取“我的文档”,“我的音乐”,“我的图片 ”和“我的视频”目录以及“Program Files”和“Cookies”目录,而如果想对 所有磁盘目录进行访问,则需要使用COM功能进行操作,我们将在下篇讲述,本篇 将着重讲述 Silverlight 4 API对“我的”系列目录的操作方法。
在实现具体功能前,首先需要为项目添加两个新文件,一个是资源文件 Resources.xaml,该资源文件引用自开源控件BlackLight资源样式,主要目的是 为了创建新按钮演示效果,如下图:
另一个是小图片控件ThumbImage.xaml,该文件是用于载入“我的图片”目录后 的图片略缩图,其代码较为简单,
1
2xmlns=“schemas.microsoft/winfx/2006/xaml/presentation”
3xmlns:x=“schemas.microsoft/winfx/2006/xaml”
4 xmlns:d=“schemas.microsoft/expression/blend/2008”
5xmlns:mc=“schemas.openxmlformats/markup- compatibility/2006”
6 mc:Ignorable=“d”
7d:DesignHeight=“300” d:DesignWidth=“400”>
8
9
10
11
12
1 namespace SilverlightOOBDemo
2 {
3 public partial class ThumbImage : UserControl
4 {
5 private Image _OriginalImage;
6 public Image OriginalImage
7 {
8 get
9 {
10return _OriginalImage;
11 }
12 set
13 {
14 this._OriginalImage = value;
15ThumbnailImage.Source = new WriteableBitmap(_OriginalImage, null);
16 }
17 }
18
19 public ThumbImage()
20 {
21 InitializeComponent();
22 }
23 }
24 }
为了能够激活存取事件,我们需要在OutofBrowserMainpage主窗口页面添加按 钮控件,其样式调用自资源文件Resources.xaml,对于资源样式调用,这里不再 赘述,如果不明白的,请看“Expression Blend实例中文教程系列文章”
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
同时,为了能够载入本地“我的图片”目录中的图片文件,我们需要在 OutofBrowserMainpage中使用一个ListBox控件,载入上面我们创建的ThumbImage 控件来显示,所有图片略缩图列表,
1
现在,我们可以为openfilebtn按钮控件创建事件,使其响应用户操作,打开 对应目录进行文件浏览
1 private void openFileBtn_Click(object sender, RoutedEventArgs e)
2 {
3 if (Application.Current.HasElevatedPermissions)
4 {
5 var imageFiles = Directory.EnumerateFiles(Environment.GetFolderPath (Environment.SpecialFolder.MyPictures), “*.jpg”, SearchOption.AllDirectories);
6foreach (var imagePath in imageFiles)
7{
8 AddImageToList(new FileInfo(imagePath));
9}
10 }
11 }
在上面代码中,如果用户已经提升了OOB应用权限 (Application.Current.HasElevatedPermissions),将通过Environment中的 GetFolderPath方法获取到本地“My..”目录下的文件,其中 Environment.SpecialFolder可以设定特殊目录,
更多详细,请看MSDN解释。
在上面代码中,有一个方法AddImageToList,将文件路径信息读取,然后将图 片文件信息进行绑定到ListBox。
1 private void AddImageToList(FileInfo fileinfo)
2 {
3 FileStream fileStream = fileinfo.OpenRead();
4 Image img = new Image();
5 BitmapImage bi = new BitmapImage();
6 bi.SetSource(fileStream);
7 img.Margin = new Thickness(5d);
8 img.Stretch = Stretch.UniformToFill;
9 img.Source = bi;
10 try { img.Tag = fileinfo.FullName; }
11 catch { }
12 ThumbImage thumbnail = new ThumbImage ();
13 thumbnail.OriginalImage = img;
14 lsMyPictures.Items.Add (thumbnail);
15 }
在读取“我的图片”目录信息后,将各个图片载入到ThumbImage控件中,然后 使用ListBox承载各个图片,这样也就完成了OOB应用对本地目录的浏览。其效果 如下:
通过以上的代码,我们可以快速修改,浏览“我的文档”,“我的音乐”和“ 我的视频”等目录;在OutofBrowserMainPage页面添加代码:
1
1 private void AddDocToList()
2 {
3 var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
4 lsMyDocuments.ItemsSource = System.IO.Directory.EnumerateFiles (path);
5 }
然后在openFileBtn_Click事件中调用AddDocToList();即可获取到“我的文档 ”文件列表, 其他目录与其类似,就不再做代码演示,大家可以自己尝试,如果 遇到问题,我们可以一起讨论 。
看到这里,有的朋友可能会问,既然已经可以实现浏览本地目录功能,是不是 也应该可以对本地目录文件进行操作呢?答案是肯定的。当OOB应用获取到权限提 升后,则可以使用File类对文件进行操作,例如,移动文件,删除文件等。对目 前的项目我们进行简单的修改,演示如何将“我的文档”目录的文件 ,移动到“我的音乐”目录中,并且删除源目录的相同文件,
首先在OutofBrowserMainPage.xaml页面添加一个新的ListBox,承载“ 我的音乐”目录文件;
1
2
3
4
在后台代码添加,浏览载入“我的音乐”目录;
1 private void AddMusicToList()
2 {
3 var path = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
4 lsMyMusics.Items.Clear();
5 DirectoryInfo myDirectory = new DirectoryInfo(path);
6 foreach (FileInfo file in myDirectory.EnumerateFiles())
7 {
8lsMyMusics.Items.Add(file);
9 }
10 }
简单修改“我的文档”ListBox代码,和后台代码:
1
2
3
4
1 private void AddDocToList()
2 {
3 var path = Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments);
4 lsMyDocuments.Items.Clear();
5 DirectoryInfo myDirectory = new DirectoryInfo(path);
6 foreach (FileInfo file in myDirectory.EnumerateFiles())
7 {
8lsMyDocuments.Items.Add(file);
9 }
10 //lsMyDocuments.ItemsSource = System.IO.Directory.EnumerateFiles (path);
11 }
运行后即可得到如下效果:
下面我们想实现,点击按钮事件后,将“我的文档”目录中的选中文件,移动 到“我的音乐”目录中,
首先,在应用的ToolBar中添加一个移动按钮moveFileBtn
实现moveFileBtn被点击后,移动文件到“我的音乐”目录,
1 private void moveFileBtn_Click(object sender, RoutedEventArgs e)
2 {
3 FileInfo selectedFile = (FileInfo) lsMyDocuments.SelectedValue;
4 string path = Environment.GetFolderPath(Environment.SpecialFolder.MyMusic);
5 string formatPath = string.Format(“{0} \\{1}”, path, selectedFile.Name);
6 if (!File.Exists(formatPath))
7 {
8File.Move(selectedFile.FullName, formatPath);
9 File.Delete (selectedFile.FullName);
10 }
11 LoadFiles();
12 }
13
14 private void LoadFiles()
15 {
16 AddDocToList();
17 AddMusicToList();
18 }
这里我们用的是最基本的File文件类操作文件的移动和删除,当然,这需要 OOB应用被提升信任权限后,才可以操作,否则,将提示权限错误。
这样,我们就可以查看演示了,当运行应用后,“我的文档”和“我的音乐” 两个目录将被载入文件列表,选中“我的文档”中任一文件,然后点击“移动” 按钮,就会发现该文件被移动到“我的音乐”目录中,而在“我的文档”中的源 文件已经被删除。
通过上文,我们可以了解到Silverlight Out of Browser的可信任应用对本地 目录和文件的操作方法以及基本API的用法,下一篇,我们将通过另外一个实例演 示更多Out of Browser的可信任应用的强大功能。
注:本篇部分代码是参考Silverlight开源项目。
本文配套源码
更多推荐
Silverlight实例教程 Out of Browser与Office的互操作
发布评论