( See Simple Silverlight RSS Reader. (MVVM Pattern) )
So I was wondering if I create the application with OOB(out of browser).
* Out-of-Browser Settings on Visual Studio
Check "Require elevated trust when running outside the browser".
* Install PFX file on the silverlight project.
1-1.Create a self-signed SSL certificate ( use for text, i.e. non trusted )
makecert.exe( Visual studio pro or windows sdk. )
http://msdn.microsoft.com/en-US/library/bfsktky3(v=VS.100).aspx
(1) Create a root certificate authority.
makecert -n "CN=Dummy Certificate Authority" -r -a sha1 -sr LocalMachine -sky signature -sv OOBRootCA.pvk OOBRootCA.cer
(2) Create a code-signing certificate.
makecert -sv OOBCodeSigningCA.pvk -iv OOBRootCA.pvk -n "CN=OOB Code Signing CA" -ic OOBRootCA.cer OOBCodeSigningCA.cer
(3) Convert the certificate and key to pfx file.
pvk2pfx -pvk OOBCodeSigningCA.pvk -spc OOBCodeSigningCA.cer -pfx DummyOOBCodeSigningCA.pfx -po <password>
1-2. Install the file on the project.
(1) In solution explorer, right-click the project name, and then click Properties. In the Properties Pages dialog box, click the Signing tab.
![]() |
(2) Click "Select from File" button and Select the pfx file.
![]() |
(3) Enter the password.
(4) Save Properties, then it's done.
* Coding Consideration on OOB
1. Check network status and Download itself if updated.
App.xaml.cs
public App() { . . . NetworkChange.NetworkAddressChanged += NetworkChange_NetworkAddressChanged; if (this.IsRunningOutOfBrowser) this.CheckAndDownloadUpdateCompleted += App_CheckAndDownloadUpdateCompleted; . . . } private void NetworkChange_NetworkAddressChanged(object sender, EventArgs e) { if (NetworkInterface.GetIsNetworkAvailable()) { // something } else { // something } } private void App_CheckAndDownloadUpdateCompleted( object sender, CheckAndDownloadUpdateCompletedEventArgs e) { if (e.UpdateAvailable) { MessageBox.Show("The update has been downloaded. Please restart the application.", "Application Update",MessageBoxButton.OK); } }
2. Custom Windows Control bar for Silverlight OOB.
WindowControlBar.xaml
<UserControl x:Class="RSSReaderOOB.WindowControlBar" 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="26" d:DesignWidth="300"> <Grid Background="LightGray" Height="26" MaxHeight="26" MinHeight="26"> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> <ColumnDefinition Width="100" /> </Grid.ColumnDefinitions> <Image x:Name="IconImage" Source="/Images/IconSL16.png" Width="16" Height="16" Stretch="Uniform" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="3,0,0,0" /> <TextBlock x:Name="TitleTextBlock" Margin="22,0,0,0" FontSize="13" Text="Silverlight OOB Application" Grid.Column="0" VerticalAlignment="Center" HorizontalAlignment="Left" /> <StackPanel x:Name="WindowControlBarRoot" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Top" Margin="0,0,0,0" HorizontalAlignment="Right"> <Canvas Width="30" x:Name="wcbMinimizeButton" Cursor="Hand" Background="#00000000" Visibility="Visible" Height="20" ToolTipService.ToolTip="Minimize"> <Border Width="30" Height="20" Background="#FF939393" BorderBrush="#FF000000" BorderThickness="1,1,0,1" CornerRadius="0,0,0,5"> <Border BorderThickness="1.5,1.5,1.5,1.5" CornerRadius="0,0,0,5"> <Border.Background> <LinearGradientBrush EndPoint="0.514,0.623" StartPoint="0.514,0.191"> <GradientStop Color="#FF828282" Offset="0"/> <GradientStop Color="#FF262626" Offset="1"/> </LinearGradientBrush> </Border.Background> <Rectangle Margin="6,9,6,3" Fill="#FFD6D5D5" Stroke="#FF000000" StrokeThickness="0.5"/> </Border> </Border> </Canvas> <Canvas Width="30" x:Name="wcbMaximizeButton" Cursor="Hand" Background="#00000000" Visibility="Visible" Height="20" ToolTipService.ToolTip="Maximize"> <Border Width="30" Height="20" Background="#FF939393" BorderBrush="#FF000000" BorderThickness="1,1,0,1"> <Border BorderThickness="1.5,1.5,1.5,1.5" CornerRadius="0,0,0,0" Width="29" Height="18"> <Border.Background> <LinearGradientBrush EndPoint="0.514,0.623" StartPoint="0.514,0.191"> <GradientStop Color="#FF828282" Offset="0"/> <GradientStop Color="#FF262626" Offset="1"/> </LinearGradientBrush> </Border.Background> <Border Background="#FFD6D5D5" Margin="6,2,6,2" BorderBrush="#FF000000" BorderThickness="0.5,0.5,0.5,0.5"> <Rectangle Stroke="#FF000000" Margin="2,2,2,2" StrokeThickness="0.5"> <Rectangle.Fill> <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> <GradientStop Color="#FF828282" Offset="0"/> <GradientStop Color="#FF262626" Offset="1"/> </LinearGradientBrush> </Rectangle.Fill> </Rectangle> </Border> </Border> </Border> </Canvas> <Canvas Width="40" x:Name="wcbCloseButton" Cursor="Hand" Background="#00000000" Opacity="1" Height="20" ToolTipService.ToolTip="Close"> <Border Width="40" Height="20" Background="#FF939393" BorderBrush="#FF000000" BorderThickness="1,1,1,1" CornerRadius="0,0,5,0"> <Border BorderThickness="1,1,1,1" CornerRadius="0,0,5,0" Width="37" Height="16" x:Name="border"> <Border.Background> <LinearGradientBrush EndPoint="0.514,0.623" StartPoint="0.514,0.191"> <GradientStop Color="#FF956161" Offset="0"/> <GradientStop Color="#FF490E0E" Offset="1"/> </LinearGradientBrush> </Border.Background> <TextBlock Text="X" TextWrapping="Wrap" Foreground="#FFECECEC" HorizontalAlignment="Center" VerticalAlignment="Center" x:Name="textBlock"/> </Border> </Border> </Canvas> </StackPanel> </Grid> </UserControl>
WindowControlBar.xaml.cs
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Input; namespace RSSReaderOOB { public partial class WindowControlBar : UserControl { public static readonly DependencyProperty TitleProperty = DependencyProperty.Register("Title", typeof(string), typeof(WindowControlBar), new PropertyMetadata(OnTitleChanged)); public static readonly DependencyProperty IconProperty = DependencyProperty.Register("Icon", typeof(Uri), typeof(WindowControlBar), new PropertyMetadata(OnIconChanged)); public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } } public Uri Icon { get { return (Uri)GetValue(IconProperty); } set { SetValue(IconProperty, value); } } private static void OnTitleChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { string newTitle = e.NewValue as string; WindowControlBar wcb = sender as WindowControlBar; wcb.TitleTextBlock.Text = newTitle; } } private static void OnIconChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e) { if (e.NewValue != null) { if (e.NewValue is Uri) { WindowControlBar wcb = sender as WindowControlBar; wcb.IconImage.Source = new System.Windows.Media.Imaging.BitmapImage(e.NewValue as Uri); } } } public WindowControlBar() { InitializeComponent(); if (Application.Current.IsRunningOutOfBrowser) { this.Visibility = Visibility.Visible; this.wcbMaximizeButton.MouseLeftButtonDown += new MouseButtonEventHandler(wcbMaximizeButton_MouseLeftButtonDown); this.wcbMinimizeButton.MouseLeftButtonDown += new MouseButtonEventHandler(wcbMinimizeButton_MouseLeftButtonDown); this.wcbCloseButton.MouseLeftButtonDown += new MouseButtonEventHandler(wcbCloseButton_MouseLeftButtonDown); this.MouseLeftButtonDown += new MouseButtonEventHandler(WindowControlBar_MouseLeftButtonDown); } else this.Visibility = Visibility.Collapsed; } void WindowControlBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Application.Current.MainWindow.DragMove(); } void wcbCloseButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Application.Current.MainWindow.Close(); } void wcbMinimizeButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Application.Current.MainWindow.WindowState = WindowState.Minimized; } void wcbMaximizeButton_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { if (Application.Current.MainWindow.WindowState == WindowState.Normal) Application.Current.MainWindow.WindowState = WindowState.Maximized; else Application.Current.MainWindow.WindowState = WindowState.Normal; } } }
Here are the capture images of the application.
1.Start the application and then click Install button.
![]() |
The Application on the browser. |
2.Click Install button.
![]() |
* Security Warning appears because of Non-Trusted SSL. |
3.Enter a RSS feed url in the textbox.
![]() |
4. Done.
No comments:
Post a Comment