( 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