[源码下载]
作者: webabcd
介绍
Silverlight 4.0 OOB 之 被信任的应用程序:
在线DEMO
http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html
示例
1、关于“被信任的应用程序”的简要概述
Demo.xaml
2、访问本地文件系统的 Demo
AccessLocalFile.xaml
AccessLocalFile.xaml.cs
3、通过调用 Excel API(COM 接口)的方式,将数据导出为 Excel 格式
COMDemo.xaml
COMDemo.xaml.cs
4、自定义窗口样式和行为的 Demo(详见 CustomOOBWindow 项目)
generic.xaml
MyWindow.cs
MainPage.xaml
OK
[源码下载]
稳扎稳打Silverlight(45) - 4.0浏览器外运行(Out Of browser)之被信任的应用程序(Trusted Application)
作者: webabcd
介绍
Silverlight 4.0 OOB 之 被信任的应用程序:
在线DEMO
http://www.cnblogs.com/webabcd/archive/2010/08/09/1795417.html
示例
1、关于“被信任的应用程序”的简要概述
Demo.xaml
<
navigation:Page
x:Class
="Silverlight40.TrustedApplication.Demo"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Title ="Other Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< TextBlock Margin ="5" Text ="被信任的应用程序 - 对浏览器外应用程序提升信任级别。在 Silverlight 项目上单击右键 -> 属性 -> Silverlight -> Out-of-browser Settings -> 选中 Require elevated trust when running outside the browser" />
< TextBlock Margin ="5" Text ="Application.Current.HasElevatedPermissions - 判断 OOB 模式中的应用程序是否为被信任的应用程序" />
< TextBlock Margin ="5" Text ="无需策略文件即可跨域通信,TCP通信端口不再限制为4502-4534" />
< TextBlock Margin ="5" Text ="全屏后,按 ESC 键应用程序将不会退出全屏模式" />
< TextBlock Margin ="5" Text ="应用程序签名:使用工具 SignTool.exe" />
< TextBlock Margin ="5" Text ="访问本地文件系统:详见本目录下的 AccessLocalFile.xaml" />
< TextBlock Margin ="5" Text ="调用 COM 接口:详见本目录下的 COMDemo..xaml" />
< TextBlock Margin ="5" Text ="自定义窗口:详见本解决方案的 CustomOOBWindow 项目" />
</ StackPanel >
</ Grid >
</ navigation:Page >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Title ="Other Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< TextBlock Margin ="5" Text ="被信任的应用程序 - 对浏览器外应用程序提升信任级别。在 Silverlight 项目上单击右键 -> 属性 -> Silverlight -> Out-of-browser Settings -> 选中 Require elevated trust when running outside the browser" />
< TextBlock Margin ="5" Text ="Application.Current.HasElevatedPermissions - 判断 OOB 模式中的应用程序是否为被信任的应用程序" />
< TextBlock Margin ="5" Text ="无需策略文件即可跨域通信,TCP通信端口不再限制为4502-4534" />
< TextBlock Margin ="5" Text ="全屏后,按 ESC 键应用程序将不会退出全屏模式" />
< TextBlock Margin ="5" Text ="应用程序签名:使用工具 SignTool.exe" />
< TextBlock Margin ="5" Text ="访问本地文件系统:详见本目录下的 AccessLocalFile.xaml" />
< TextBlock Margin ="5" Text ="调用 COM 接口:详见本目录下的 COMDemo..xaml" />
< TextBlock Margin ="5" Text ="自定义窗口:详见本解决方案的 CustomOOBWindow 项目" />
</ StackPanel >
</ Grid >
</ navigation:Page >
2、访问本地文件系统的 Demo
AccessLocalFile.xaml
<
navigation:Page
x:Class
="Silverlight40.TrustedApplication.AccessLocalFile"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Title ="AccessLocalFile Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< TextBlock Text ="在不使用 OpenFileDialog 和 SaveFileDialog 的情况下,访问 MyDocuments, MyMusic, MyPictures, MyVideos 文件夹" />
<!-- 显示“我的文档”中的文件夹列表 -->
< ListBox Name ="listBoxDirectory" HorizontalAlignment ="Left" >
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel Orientation ="Horizontal" >
< TextBlock Text =" {Binding Name} " Margin ="1" />
</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
<!-- 显示“我的文档”中的文件列表 -->
< ListBox Name ="listBoxFile" HorizontalAlignment ="Left" >
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel Orientation ="Horizontal" >
< TextBlock Text =" {Binding Name} " Margin ="1" />
</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
</ StackPanel >
</ Grid >
</ navigation:Page >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
Title ="AccessLocalFile Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< TextBlock Text ="在不使用 OpenFileDialog 和 SaveFileDialog 的情况下,访问 MyDocuments, MyMusic, MyPictures, MyVideos 文件夹" />
<!-- 显示“我的文档”中的文件夹列表 -->
< ListBox Name ="listBoxDirectory" HorizontalAlignment ="Left" >
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel Orientation ="Horizontal" >
< TextBlock Text =" {Binding Name} " Margin ="1" />
</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
<!-- 显示“我的文档”中的文件列表 -->
< ListBox Name ="listBoxFile" HorizontalAlignment ="Left" >
< ListBox.ItemTemplate >
< DataTemplate >
< StackPanel Orientation ="Horizontal" >
< TextBlock Text =" {Binding Name} " Margin ="1" />
</ StackPanel >
</ DataTemplate >
</ ListBox.ItemTemplate >
</ ListBox >
</ StackPanel >
</ Grid >
</ navigation:Page >
AccessLocalFile.xaml.cs
/*
* 访问本地文件系统的 Demo,只能访问“我的文档”,“我的音乐”,“我的图片”,“我的视频” 文件夹
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.IO;
namespace Silverlight40.TrustedApplication
{
public partial class AccessLocalFile : Page
{
public AccessLocalFile()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if ( ! App.Current.IsRunningOutOfbrowser)
{
MessageBox.Show( " 请在OOB中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
// Application.Current.HasElevatedPermissions - 判断 OOB 模式中的应用程序是否为被信任的应用程序
if (Application.Current.HasElevatedPermissions)
{
/*
* GetFolderPath(Environment.SpecialFolder folder) - 获取指定的文件夹的路径
* Environment.SpecialFolder - Windows 操作系统中特殊文件夹的枚举(在被信任程序中使用)
* Environment.SpecialFolder.MyDocuments - 我的文档。可以在被信任程序中访问
* Environment.SpecialFolder.MyMusic - 我的音乐。可以在被信任程序中访问
* Environment.SpecialFolder.MyPictures - 我的图片。可以在被信任程序中访问
* Environment.SpecialFolder.MyVideos - 我的视频。可以在被信任程序中访问
* Environment.SpecialFolder 还有其他很多枚举值,详见文档
* 针对文件夹操作和文件操的类有:Directory, DirectoryInfo, File, FileInfo, FileStream, Path, StreamReader, StreamWriter
*/
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DirectoryInfo root = new DirectoryInfo(path);
// 我的文档中的文件夹
listBoxDirectory.ItemsSource = root.EnumerateDirectories();
// 我的文档中的文件
listBoxFile.ItemsSource = root.EnumerateFiles();
}
}
}
}
* 访问本地文件系统的 Demo,只能访问“我的文档”,“我的音乐”,“我的图片”,“我的视频” 文件夹
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.IO;
namespace Silverlight40.TrustedApplication
{
public partial class AccessLocalFile : Page
{
public AccessLocalFile()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if ( ! App.Current.IsRunningOutOfbrowser)
{
MessageBox.Show( " 请在OOB中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
// Application.Current.HasElevatedPermissions - 判断 OOB 模式中的应用程序是否为被信任的应用程序
if (Application.Current.HasElevatedPermissions)
{
/*
* GetFolderPath(Environment.SpecialFolder folder) - 获取指定的文件夹的路径
* Environment.SpecialFolder - Windows 操作系统中特殊文件夹的枚举(在被信任程序中使用)
* Environment.SpecialFolder.MyDocuments - 我的文档。可以在被信任程序中访问
* Environment.SpecialFolder.MyMusic - 我的音乐。可以在被信任程序中访问
* Environment.SpecialFolder.MyPictures - 我的图片。可以在被信任程序中访问
* Environment.SpecialFolder.MyVideos - 我的视频。可以在被信任程序中访问
* Environment.SpecialFolder 还有其他很多枚举值,详见文档
* 针对文件夹操作和文件操的类有:Directory, DirectoryInfo, File, FileInfo, FileStream, Path, StreamReader, StreamWriter
*/
string path = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
DirectoryInfo root = new DirectoryInfo(path);
// 我的文档中的文件夹
listBoxDirectory.ItemsSource = root.EnumerateDirectories();
// 我的文档中的文件
listBoxFile.ItemsSource = root.EnumerateFiles();
}
}
}
}
3、通过调用 Excel API(COM 接口)的方式,将数据导出为 Excel 格式
COMDemo.xaml
<
navigation:Page
x:Class
="Silverlight40.TrustedApplication.COMDemo"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:sdk ="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
Title ="COMDemo Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< Button Name ="btnExport" Content ="导出到 Excel" Click ="btnExport_Click" />
< sdk:DataGrid Name ="dataGrid" HorizontalAlignment ="Left" VerticalAlignment ="Top" Width ="400" Height ="300" IsReadOnly ="True" AutoGenerateColumns ="True" />
</ StackPanel >
</ Grid >
</ navigation:Page >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:navigation ="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
xmlns:sdk ="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk"
Title ="COMDemo Page" >
< Grid x:Name ="LayoutRoot" >
< StackPanel HorizontalAlignment ="Left" >
< Button Name ="btnExport" Content ="导出到 Excel" Click ="btnExport_Click" />
< sdk:DataGrid Name ="dataGrid" HorizontalAlignment ="Left" VerticalAlignment ="Top" Width ="400" Height ="300" IsReadOnly ="True" AutoGenerateColumns ="True" />
</ StackPanel >
</ Grid >
</ navigation:Page >
COMDemo.xaml.cs
/*
* 此例用于演示:通过调用 Excel API(COM 接口)的方式,将数据导出为 Excel 格式
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices.Automation;
namespace Silverlight40.TrustedApplication
{
public partial class COMDemo : Page
{
public COMDemo()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if ( ! App.Current.IsRunningOutOfbrowser)
{
MessageBox.Show( " 请在 OOB 中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
else if ( ! Application.Current.HasElevatedPermissions)
{
MessageBox.Show( " 请在 “被信任的应用程序” 中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
dataGrid.ItemsSource = GetProducts();
}
private void btnExport_Click( object sender, RoutedEventArgs e)
{
dynamic excelApp = typeof (Object);
try
{
/*
* AutomationFactory.IsAvailable - 获取一个值,该值表示 AutomationFactory 是否可用
* AutomationFactory.CreateObject() - 根据编程标识符(ProgID)激活指定的组件,并返回该引用
* AutomationFactory.Getobject() - 根据编程标识符(ProgID)获取已激活的并且当前正在运行的组件引用
*/
if ( ! AutomationFactory.IsAvailable)
{
MessageBox.Show( " 无法调用 COM 接口 " );
return ;
}
// 激活并获取 Excel.Application 引用
excelApp = AutomationFactory.CreateObject( " Excel.Application " );
}
catch (Exception ex)
{
MessageBox.Show( " 没有安装 Excel ? " + ex.Message);
}
excelApp.Visible = true ;
// 新开一个工作簿
dynamic workbook = excelApp.Workbooks;
workbook.Add();
// 当前工作表
dynamic sheet = excelApp.ActiveSheet;
dynamic cell = null ;
int index = 1 ;
foreach (Product p in dataGrid.ItemsSource)
{
cell = sheet.Cells[index, 1 ];
cell.Value = p.ProductId;
// 获取指定了行列的单元格
cell = sheet.Cells[index, 2 ];
// 单元格内要显示的内容
cell.Value = p.Name;
// 设置单元格背景颜色为红色。这里的 16 位颜色值为 BGR
cell.Interior.Color = 0x0000FF ;
cell = sheet.Cells[index, 3 ];
cell.Value = p.Price;
index ++ ;
}
}
// 数据源
private ObservableCollection < Product > GetProducts()
{
return new ObservableCollection < Product >
{
new Product{ ProductId = 1 , Name = " ProductName01 " , Price = 100.6m },
new Product{ ProductId = 2 , Name = " ProductName02 " , Price = 60.8m },
new Product{ ProductId = 3 , Name = " ProductName03 " , Price = 189.2m },
new Product{ ProductId = 4 , Name = " ProductName04 " , Price = 56m},
new Product{ ProductId = 5 , Name = " ProductName05 " , Price = 69m},
new Product{ ProductId = 6 , Name = " ProductName06 " , Price = 244m},
};
}
}
// 实体类
public class Product
{
public int ProductId { get ; set ; }
public string Name { get ; set ; }
public decimal Price { get ; set ; }
}
}
* 此例用于演示:通过调用 Excel API(COM 接口)的方式,将数据导出为 Excel 格式
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Navigation;
using System.Collections.ObjectModel;
using System.Runtime.InteropServices.Automation;
namespace Silverlight40.TrustedApplication
{
public partial class COMDemo : Page
{
public COMDemo()
{
InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if ( ! App.Current.IsRunningOutOfbrowser)
{
MessageBox.Show( " 请在 OOB 中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
else if ( ! Application.Current.HasElevatedPermissions)
{
MessageBox.Show( " 请在 “被信任的应用程序” 中运行 " );
LayoutRoot.Visibility = Visibility.Collapsed;
}
dataGrid.ItemsSource = GetProducts();
}
private void btnExport_Click( object sender, RoutedEventArgs e)
{
dynamic excelApp = typeof (Object);
try
{
/*
* AutomationFactory.IsAvailable - 获取一个值,该值表示 AutomationFactory 是否可用
* AutomationFactory.CreateObject() - 根据编程标识符(ProgID)激活指定的组件,并返回该引用
* AutomationFactory.Getobject() - 根据编程标识符(ProgID)获取已激活的并且当前正在运行的组件引用
*/
if ( ! AutomationFactory.IsAvailable)
{
MessageBox.Show( " 无法调用 COM 接口 " );
return ;
}
// 激活并获取 Excel.Application 引用
excelApp = AutomationFactory.CreateObject( " Excel.Application " );
}
catch (Exception ex)
{
MessageBox.Show( " 没有安装 Excel ? " + ex.Message);
}
excelApp.Visible = true ;
// 新开一个工作簿
dynamic workbook = excelApp.Workbooks;
workbook.Add();
// 当前工作表
dynamic sheet = excelApp.ActiveSheet;
dynamic cell = null ;
int index = 1 ;
foreach (Product p in dataGrid.ItemsSource)
{
cell = sheet.Cells[index, 1 ];
cell.Value = p.ProductId;
// 获取指定了行列的单元格
cell = sheet.Cells[index, 2 ];
// 单元格内要显示的内容
cell.Value = p.Name;
// 设置单元格背景颜色为红色。这里的 16 位颜色值为 BGR
cell.Interior.Color = 0x0000FF ;
cell = sheet.Cells[index, 3 ];
cell.Value = p.Price;
index ++ ;
}
}
// 数据源
private ObservableCollection < Product > GetProducts()
{
return new ObservableCollection < Product >
{
new Product{ ProductId = 1 , Name = " ProductName01 " , Price = 100.6m },
new Product{ ProductId = 2 , Name = " ProductName02 " , Price = 60.8m },
new Product{ ProductId = 3 , Name = " ProductName03 " , Price = 189.2m },
new Product{ ProductId = 4 , Name = " ProductName04 " , Price = 56m},
new Product{ ProductId = 5 , Name = " ProductName05 " , Price = 69m},
new Product{ ProductId = 6 , Name = " ProductName06 " , Price = 244m},
};
}
}
// 实体类
public class Product
{
public int ProductId { get ; set ; }
public string Name { get ; set ; }
public decimal Price { get ; set ; }
}
}
4、自定义窗口样式和行为的 Demo(详见 CustomOOBWindow 项目)
generic.xaml
<
ResourceDictionary
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local ="clr-namespace:CustomOOBWindow" >
< Style targettype ="local:MyWindow" >
< Setter Property ="Template" >
< Setter.Value >
< ControlTemplate targettype ="local:MyWindow" >
< Border x:Name ="windowBorder" BorderBrush ="Green" Background ="Red" BorderThickness ="2" CornerRadius ="5" >
< Grid x:Name ="layoutRoot" >
<!-- 窗口的上下左右都留出 5 个像素的边框 -->
< Grid.ColumnDeFinitions >
< ColumnDeFinition Width ="5" />
< ColumnDeFinition Width ="*" />
< ColumnDeFinition Width ="5" />
</ Grid.ColumnDeFinitions >
< Grid.RowDeFinitions >
< RowDeFinition Height ="5" />
< RowDeFinition Height ="*" />
< RowDeFinition Height ="5" />
</ Grid.RowDeFinitions >
<!-- 在窗口的 4 个边和 4 个角上放置透明的矩形,用于当通过鼠标改变窗口大小时,鼠标移动到边或角上时改变鼠标的样式 -->
< Grid.Resources >
< Style targettype ="Rectangle" >
< Setter Property ="Fill" Value ="Transparent" />
</ Style >
</ Grid.Resources >
< Rectangle x:Name ="topLeftCorner" Grid.Row ="0" Grid.Column ="0" Cursor ="SizeNWSE" />
< Rectangle x:Name ="topEdge" Grid.Row ="0" Grid.Column ="1" Cursor ="SizeNS" />
< Rectangle x:Name ="topRightCorner" Grid.Row ="0" Grid.Column ="2" Cursor ="SizenesW" />
< Rectangle x:Name ="leftEdge" Grid.Row ="1" Grid.Column ="0" Cursor ="SizeWE" />
< Rectangle x:Name ="rightEdge" Grid.Row ="1" Grid.Column ="2" Cursor ="SizeWE" />
< Rectangle x:Name ="bottomLeftCorner" Grid.Row ="2" Grid.Column ="0" Cursor ="SizenesW" />
< Rectangle x:Name ="bottomEdge" Grid.Row ="2" Grid.Column ="1" Cursor ="SizeNS" />
< Rectangle x:Name ="bottomrightCorner" Grid.Row ="2" Grid.Column ="2" Cursor ="SizeNWSE" />
< Grid Grid.Row ="1" Grid.Column ="1" >
< Grid.RowDeFinitions >
< RowDeFinition Height ="Auto" />
< RowDeFinition Height ="*" />
</ Grid.RowDeFinitions >
< Grid x:Name ="titleBar" Margin ="0,3" >
< Grid.Resources >
< Style targettype ="Button" >
< Setter Property ="Width" Value ="20" />
< Setter Property ="Height" Value ="20" />
< Setter Property ="Padding" Value ="0" />
</ Style >
</ Grid.Resources >
< Grid.ColumnDeFinitions >
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="*" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
</ Grid.ColumnDeFinitions >
<!-- 窗口的图标和标题 -->
< Image x:Name ="windowIcon" Grid.Column ="0" Width ="16" Height ="16" />
< TextBlock x:Name ="title" Grid.Column ="1" FontSize ="12" Padding ="5,0" />
<!-- 总在最前按钮,最小化按钮,最大化按钮,关闭按钮 -->
< ToggleButton x:Name ="pinButton" Grid.Column ="2" Width ="80" Content ="总在最前" />
< Button x:Name ="minButton" Grid.Column ="3" Width ="80" Content ="最小化" />
< ToggleButton x:Name ="maxButton" Grid.Column ="4" Width ="80" Content ="最大化" />
< Button x:Name ="closeButton" Grid.Column ="5" Width ="80" Content ="关闭" />
</ Grid >
<!--
ContentPresenter - 窗口内的内容
-->
< Border Background ="White" Grid.Row ="1" BorderBrush ="Blue" BorderThickness ="2" >
< ContentPresenter />
</ Border >
</ Grid >
</ Grid >
</ Border >
</ ControlTemplate >
</ Setter.Value >
</ Setter >
</ Style >
</ ResourceDictionary >
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local ="clr-namespace:CustomOOBWindow" >
< Style targettype ="local:MyWindow" >
< Setter Property ="Template" >
< Setter.Value >
< ControlTemplate targettype ="local:MyWindow" >
< Border x:Name ="windowBorder" BorderBrush ="Green" Background ="Red" BorderThickness ="2" CornerRadius ="5" >
< Grid x:Name ="layoutRoot" >
<!-- 窗口的上下左右都留出 5 个像素的边框 -->
< Grid.ColumnDeFinitions >
< ColumnDeFinition Width ="5" />
< ColumnDeFinition Width ="*" />
< ColumnDeFinition Width ="5" />
</ Grid.ColumnDeFinitions >
< Grid.RowDeFinitions >
< RowDeFinition Height ="5" />
< RowDeFinition Height ="*" />
< RowDeFinition Height ="5" />
</ Grid.RowDeFinitions >
<!-- 在窗口的 4 个边和 4 个角上放置透明的矩形,用于当通过鼠标改变窗口大小时,鼠标移动到边或角上时改变鼠标的样式 -->
< Grid.Resources >
< Style targettype ="Rectangle" >
< Setter Property ="Fill" Value ="Transparent" />
</ Style >
</ Grid.Resources >
< Rectangle x:Name ="topLeftCorner" Grid.Row ="0" Grid.Column ="0" Cursor ="SizeNWSE" />
< Rectangle x:Name ="topEdge" Grid.Row ="0" Grid.Column ="1" Cursor ="SizeNS" />
< Rectangle x:Name ="topRightCorner" Grid.Row ="0" Grid.Column ="2" Cursor ="SizenesW" />
< Rectangle x:Name ="leftEdge" Grid.Row ="1" Grid.Column ="0" Cursor ="SizeWE" />
< Rectangle x:Name ="rightEdge" Grid.Row ="1" Grid.Column ="2" Cursor ="SizeWE" />
< Rectangle x:Name ="bottomLeftCorner" Grid.Row ="2" Grid.Column ="0" Cursor ="SizenesW" />
< Rectangle x:Name ="bottomEdge" Grid.Row ="2" Grid.Column ="1" Cursor ="SizeNS" />
< Rectangle x:Name ="bottomrightCorner" Grid.Row ="2" Grid.Column ="2" Cursor ="SizeNWSE" />
< Grid Grid.Row ="1" Grid.Column ="1" >
< Grid.RowDeFinitions >
< RowDeFinition Height ="Auto" />
< RowDeFinition Height ="*" />
</ Grid.RowDeFinitions >
< Grid x:Name ="titleBar" Margin ="0,3" >
< Grid.Resources >
< Style targettype ="Button" >
< Setter Property ="Width" Value ="20" />
< Setter Property ="Height" Value ="20" />
< Setter Property ="Padding" Value ="0" />
</ Style >
</ Grid.Resources >
< Grid.ColumnDeFinitions >
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="*" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
< ColumnDeFinition Width ="Auto" />
</ Grid.ColumnDeFinitions >
<!-- 窗口的图标和标题 -->
< Image x:Name ="windowIcon" Grid.Column ="0" Width ="16" Height ="16" />
< TextBlock x:Name ="title" Grid.Column ="1" FontSize ="12" Padding ="5,0" />
<!-- 总在最前按钮,最小化按钮,最大化按钮,关闭按钮 -->
< ToggleButton x:Name ="pinButton" Grid.Column ="2" Width ="80" Content ="总在最前" />
< Button x:Name ="minButton" Grid.Column ="3" Width ="80" Content ="最小化" />
< ToggleButton x:Name ="maxButton" Grid.Column ="4" Width ="80" Content ="最大化" />
< Button x:Name ="closeButton" Grid.Column ="5" Width ="80" Content ="关闭" />
</ Grid >
<!--
ContentPresenter - 窗口内的内容
-->
< Border Background ="White" Grid.Row ="1" BorderBrush ="Blue" BorderThickness ="2" >
< ContentPresenter />
</ Border >
</ Grid >
</ Grid >
</ Border >
</ ControlTemplate >
</ Setter.Value >
</ Setter >
</ Style >
</ ResourceDictionary >
MyWindow.cs
/*
* 自定义 OOB 模式下的窗口样式和行为(需要配置为被信任的应用程序)
*/
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Windows.Controls.Primitives;
namespace CustomOOBWindow
{
public class MyWindow : ContentControl
{
/*
* 在 Out-of-browser Settings 可以设置 Window Style。背景不可透明,所以不能创建不规则形状的应用程序
* Default - 默认样式
* No Border - 无边框
* Borderless Round Corners - 无边框,带圆角,圆角的角半径为 9 个像素
*/
private Grid layoutRoot;
private Border windowBorder;
private FrameworkElement titleBar;
public MyWindow()
{
if (Application.Current.IsRunningOutOfbrowser && ! DesignerProperties.IsInDesignTool)
{
/*
* Application.Current.MainWindow - OOB 模式下的应用程序窗口。属性值为 System.Windows.Window 类型
* Window.Width - 窗口的宽
* Window.Height - 窗口的高
* Window.Top - 窗口距离屏幕顶部的距离
* Window.Left - 窗口距离屏幕左侧的距离
* Window.WindowState - 窗口状态 [System.Windows.WindowState 枚举]
* WindowState.normal - 正常大小
* WindowState.Minimized - 最小化到任务栏
* WindowState.Maximized - 最大化,全屏
* Window.TopMost - 窗口是否总在最前面
* Window.Activate() - 激活窗口,使之具有焦点,并置于最前面
* Window.IsActive - 是否为激活窗口(仅 get)
* Window.DragMove() - 实现用鼠标拖动窗口的功能
* Window.DragResize(WindowResizeEdge resizeEdge) - 根据指定的 WindowResizeEdge 改变窗口的边或角的位置,也就是调整窗口大小
* Left, Right, Top, TopLeft, TopRight, Bottom, BottomLeft, Bottomright
*/
Window mainWindow = Application.Current.MainWindow;
mainWindow.Width = 640 ;
mainWindow.Height = 480 ;
// 在 Out-of-browser Settings 选中“Set window location manually”时,这里的设置才会生效
mainWindow.Top = 100 ;
mainWindow.Left = 100 ;
mainWindow.WindowState = WindowState.normal;
mainWindow.TopMost = false ;
}
// 设置控件的默认样式
this .DefaultStyleKey = typeof (MyWindow);
}
// UI 元素在应用程序中显示之前所调用的方法
public override void OnApplyTemplate()
{
base .OnApplyTemplate();
// Control.GetTemplateChild() - 在实例化的 ControlTemplate 可视化树中检索已命名的元素
layoutRoot = GetTemplateChild( " layoutRoot " ) as Grid;
windowBorder = GetTemplateChild( " windowBorder " ) as Border;
titleBar = GetTemplateChild( " titleBar " ) as FrameworkElement;
InitializeTitleBar();
InitializeButton();
InitializeWindowBorder();
}
private void InitializeTitleBar()
{
TextBlock title = GetTemplateChild( " title " ) as TextBlock;
title.Text = Deployment.Current.OutOfbrowserSettings.WindowSettings.Title;
Image windowIcon = GetTemplateChild( " windowIcon " ) as Image;
// 设置窗口左上角的图标
// Deployment.Current.OutOfbrowserSettings - 获取 OOB 的相关配置信息
if (Deployment.Current.OutOfbrowserSettings.Icons.Count > 0 )
windowIcon.source = new System.Windows.Media.Imaging.BitmapImage( new Uri( " / " + Deployment.Current.OutOfbrowserSettings.Icons[ 0 ].source.ToString(), UriKind.Relative));
else
windowIcon.Visibility = Visibility.Collapsed;
titleBar.MouseLeftButtonDown += delegate { Application.Current.MainWindow.DragMove(); };
}
private void InitializeButton()
{
Window mainWindow = Application.Current.MainWindow;
var pinButton = GetTemplateChild( " pinButton " ) as ToggleButton;
var minButton = GetTemplateChild( " minButton " ) as Button;
var maxButton = GetTemplateChild( " maxButton " ) as ToggleButton;
var closeButton = GetTemplateChild( " closeButton " ) as Button;
pinButton.Checked += delegate { mainWindow.TopMost = true ; pinButton.Content = " 常规窗口 " ; };
pinButton.Unchecked += delegate { mainWindow.TopMost = false ; pinButton.Content = " 总在最前 " ; };
minButton.Click += delegate { mainWindow.WindowState = WindowState.Minimized; };
maxButton.Checked += delegate { mainWindow.WindowState = WindowState.Maximized; maxButton.Content = " 正常化 " ; };
maxButton.Unchecked += delegate { mainWindow.WindowState = WindowState.normal; maxButton.Content = " 最大化 " ; };
closeButton.Click += delegate { mainWindow.Close(); };
}
private void InitializeWindowBorder()
{
Window mainWindow = Application.Current.MainWindow;
UIElement topLeftCorner = GetTemplateChild( " topLeftCorner " ) as UIElement;
UIElement topEdge = GetTemplateChild( " topEdge " ) as UIElement;
UIElement topRightCorner = GetTemplateChild( " topRightCorner " ) as UIElement;
UIElement leftEdge = GetTemplateChild( " leftEdge " ) as UIElement;
UIElement rightEdge = GetTemplateChild( " rightEdge " ) as UIElement;
UIElement bottomLeftCorner = GetTemplateChild( " bottomLeftCorner " ) as UIElement;
UIElement bottomEdge = GetTemplateChild( " bottomEdge " ) as UIElement;
UIElement bottomrightCorner = GetTemplateChild( " bottomrightCorner " ) as UIElement;
topLeftCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.TopLeft); };
topEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Top); };
topRightCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.TopRight); };
leftEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Left); };
rightEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Right); };
bottomLeftCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.BottomLeft); };
bottomEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Bottom); };
bottomrightCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Bottomright); };
}
}
}
* 自定义 OOB 模式下的窗口样式和行为(需要配置为被信任的应用程序)
*/
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.ComponentModel;
using System.Windows.Controls.Primitives;
namespace CustomOOBWindow
{
public class MyWindow : ContentControl
{
/*
* 在 Out-of-browser Settings 可以设置 Window Style。背景不可透明,所以不能创建不规则形状的应用程序
* Default - 默认样式
* No Border - 无边框
* Borderless Round Corners - 无边框,带圆角,圆角的角半径为 9 个像素
*/
private Grid layoutRoot;
private Border windowBorder;
private FrameworkElement titleBar;
public MyWindow()
{
if (Application.Current.IsRunningOutOfbrowser && ! DesignerProperties.IsInDesignTool)
{
/*
* Application.Current.MainWindow - OOB 模式下的应用程序窗口。属性值为 System.Windows.Window 类型
* Window.Width - 窗口的宽
* Window.Height - 窗口的高
* Window.Top - 窗口距离屏幕顶部的距离
* Window.Left - 窗口距离屏幕左侧的距离
* Window.WindowState - 窗口状态 [System.Windows.WindowState 枚举]
* WindowState.normal - 正常大小
* WindowState.Minimized - 最小化到任务栏
* WindowState.Maximized - 最大化,全屏
* Window.TopMost - 窗口是否总在最前面
* Window.Activate() - 激活窗口,使之具有焦点,并置于最前面
* Window.IsActive - 是否为激活窗口(仅 get)
* Window.DragMove() - 实现用鼠标拖动窗口的功能
* Window.DragResize(WindowResizeEdge resizeEdge) - 根据指定的 WindowResizeEdge 改变窗口的边或角的位置,也就是调整窗口大小
* Left, Right, Top, TopLeft, TopRight, Bottom, BottomLeft, Bottomright
*/
Window mainWindow = Application.Current.MainWindow;
mainWindow.Width = 640 ;
mainWindow.Height = 480 ;
// 在 Out-of-browser Settings 选中“Set window location manually”时,这里的设置才会生效
mainWindow.Top = 100 ;
mainWindow.Left = 100 ;
mainWindow.WindowState = WindowState.normal;
mainWindow.TopMost = false ;
}
// 设置控件的默认样式
this .DefaultStyleKey = typeof (MyWindow);
}
// UI 元素在应用程序中显示之前所调用的方法
public override void OnApplyTemplate()
{
base .OnApplyTemplate();
// Control.GetTemplateChild() - 在实例化的 ControlTemplate 可视化树中检索已命名的元素
layoutRoot = GetTemplateChild( " layoutRoot " ) as Grid;
windowBorder = GetTemplateChild( " windowBorder " ) as Border;
titleBar = GetTemplateChild( " titleBar " ) as FrameworkElement;
InitializeTitleBar();
InitializeButton();
InitializeWindowBorder();
}
private void InitializeTitleBar()
{
TextBlock title = GetTemplateChild( " title " ) as TextBlock;
title.Text = Deployment.Current.OutOfbrowserSettings.WindowSettings.Title;
Image windowIcon = GetTemplateChild( " windowIcon " ) as Image;
// 设置窗口左上角的图标
// Deployment.Current.OutOfbrowserSettings - 获取 OOB 的相关配置信息
if (Deployment.Current.OutOfbrowserSettings.Icons.Count > 0 )
windowIcon.source = new System.Windows.Media.Imaging.BitmapImage( new Uri( " / " + Deployment.Current.OutOfbrowserSettings.Icons[ 0 ].source.ToString(), UriKind.Relative));
else
windowIcon.Visibility = Visibility.Collapsed;
titleBar.MouseLeftButtonDown += delegate { Application.Current.MainWindow.DragMove(); };
}
private void InitializeButton()
{
Window mainWindow = Application.Current.MainWindow;
var pinButton = GetTemplateChild( " pinButton " ) as ToggleButton;
var minButton = GetTemplateChild( " minButton " ) as Button;
var maxButton = GetTemplateChild( " maxButton " ) as ToggleButton;
var closeButton = GetTemplateChild( " closeButton " ) as Button;
pinButton.Checked += delegate { mainWindow.TopMost = true ; pinButton.Content = " 常规窗口 " ; };
pinButton.Unchecked += delegate { mainWindow.TopMost = false ; pinButton.Content = " 总在最前 " ; };
minButton.Click += delegate { mainWindow.WindowState = WindowState.Minimized; };
maxButton.Checked += delegate { mainWindow.WindowState = WindowState.Maximized; maxButton.Content = " 正常化 " ; };
maxButton.Unchecked += delegate { mainWindow.WindowState = WindowState.normal; maxButton.Content = " 最大化 " ; };
closeButton.Click += delegate { mainWindow.Close(); };
}
private void InitializeWindowBorder()
{
Window mainWindow = Application.Current.MainWindow;
UIElement topLeftCorner = GetTemplateChild( " topLeftCorner " ) as UIElement;
UIElement topEdge = GetTemplateChild( " topEdge " ) as UIElement;
UIElement topRightCorner = GetTemplateChild( " topRightCorner " ) as UIElement;
UIElement leftEdge = GetTemplateChild( " leftEdge " ) as UIElement;
UIElement rightEdge = GetTemplateChild( " rightEdge " ) as UIElement;
UIElement bottomLeftCorner = GetTemplateChild( " bottomLeftCorner " ) as UIElement;
UIElement bottomEdge = GetTemplateChild( " bottomEdge " ) as UIElement;
UIElement bottomrightCorner = GetTemplateChild( " bottomrightCorner " ) as UIElement;
topLeftCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.TopLeft); };
topEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Top); };
topRightCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.TopRight); };
leftEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Left); };
rightEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Right); };
bottomLeftCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.BottomLeft); };
bottomEdge.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Bottom); };
bottomrightCorner.MouseLeftButtonDown += delegate { mainWindow.DragResize(WindowResizeEdge.Bottomright); };
}
}
}
MainPage.xaml
<
window:MyWindow
x:Class
="CustomOOBWindow.MainPage"
xmlns:window ="clr-namespace:CustomOOBWindow;assembly=CustomOOBWindow"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable ="d"
d:DesignHeight ="300" d:DesignWidth ="400" >
< Grid x:Name ="LayoutRoot" Background ="White" >
< TextBlock Text ="自定义 OOB 窗口的 Demo,需要设置为被信任的应用程序" />
</ Grid >
</ window:MyWindow >
xmlns:window ="clr-namespace:CustomOOBWindow;assembly=CustomOOBWindow"
xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d ="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable ="d"
d:DesignHeight ="300" d:DesignWidth ="400" >
< Grid x:Name ="LayoutRoot" Background ="White" >
< TextBlock Text ="自定义 OOB 窗口的 Demo,需要设置为被信任的应用程序" />
</ Grid >
</ window:MyWindow >
OK
[源码下载]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。