下面就是小编给大家带来的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

10

11

17

18

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 ObservableCollectionitemCollection = new 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 ObservableCollectionitemCollection = new 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 ObservableCollectionitemCollection = new 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 ObservableCollectionentities = itemCollection;

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 MyValueChanged;

8 public event RoutedPropertyChangedEventHandler MyValueChangedInDrag;

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(CustomSlider_ValueChanged);

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 handler = MyValueChangedInDrag;

30

31 if ((handler != null) && (newValue != prevNewValue))

32 {

33 handler(this, new RoutedPropertyChangedEventArgs(oldValue, newValue));

34 dragSeekJustFired = true;

35 prevNewValue = newValue;

36 }

37

38 dragTimeElapsed = 0;

39 }

40 }

41

42 void CustomSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgse)

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 RoutedPropertyChangedEventHandlerhandler = MyValueChanged;

109

110 if (handler != null)

111 {

112 handler(this, new RoutedPropertyChangedEventArgs(oldValue, Value));

113 }

114 }

115

116 private void DragCompleted(object sender, DragCompletedEventArgs e)

117 {

118 dragtimer.Stop();

119 dragTimeElapsed = 0;

120

121 RoutedPropertyChangedEventHandlerhandler = MyValueChanged;

122

123 if ((handler != null) && (!dragSeekJustFired))

124 {

125 handler(this, new RoutedPropertyChangedEventArgs(oldValue, this.Value));

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 ListGetMediaFiles()

2 {

3 Listfiles = null; ;

4 MediaFile mf;

5 string path = Environment.GetFolderPath (Environment.SpecialFolder.MyMusic);

6 IEnumerablelist = Directory.EnumerateFiles(path, “*.mp3”, SearchOption.AllDirectories);

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

13

14

15

16

17

18

19

20

21

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的互操作