How To – Instalando o aplicativo Silverlight OoB(Out-of-Browser)

13 06 2010

Nesse post vamos criar uma aplicação silverlight e habilitar a opção OoB (Out-of-Browser).
OoB abreviatura para Out-of-Browser, é quando instalamos nossa aplicação silverlight.

Mas como assim instalamos?

O silverlight tem uma opção de rodarmos a aplicação no seu computador fora do browser e sem a necessidade de estar conectado a internet. O plugin do silverlight baixa o arquivo xap e cria um atalho no desktop e ou no menu iniciar.

Download do código fonte aqui.

Primeiro criamos nossa Silverlight Application.

Depois abrimos a pagina de propriedades do projeto silverlight. Podemos fazer isso de duas formas, a primeira e mais conhecida: clicando com o botão direito do mouse em cima do projeto e selecionando propriedades no ultimo link do Menu de contexto, a segunda : selecione o projeto silverlight e aperte Alt+Enter.

Para habilitar a opção OoB do aplicativo silverlight marco a opção Enable running application out of the browser.

Depois clico no botão Out-of-Browser Settings … logo abaixo do checkbox Enable running aplication out of the browser para abrir a janela de configuração do OoB.

Na janela de configuração podemos colocar o titulo da janela da aplicação quando ela estiver OoB. Podemos setar tambem outras propriedades da aplicação OoB como shortcut name, application description, icones x16, x32, x48, x128, e o principal e de grande importância marcamos a opção Require elevated trust when running outside the browser. Essa ultima opção requer uma permissão elevada de acesso que permite a aplicação acesso aos arquivos locais do cliente, pastas especiais, acesso ao clipboard e outras features do silverlight4 OoB.

Então na janela de configuração marco a opção Require elevated trust when running outside the browser e adiciono as imagens que estão no meu projeto e clico em ok.

E ja podemos rodar nossa aplicação fora do browser. Para isso rode o projeto, vai abrir a pagina no browser, clica com o botão direito na pagina e seleciono a opção Instalar {Nome da aplicação} neste computador… .

obs: Para desinstalar pode fazer a mesma coisa.

O silverlight vai abrir uma janela de instalação.

A opção criar atalhos em fica oculta para exibi-la clique na seta ao lado de Mais opções, desmarque a opção que quiser, so lembrando que se desmarcar as duas não vai ter como rodar a aplicação OoB, clique em instalar e pronto.

Se você deixou marcada a opção Área de trabalho ou Desktop, vá no desktop procure o atalho da aplicação e rode.

Beleza, agora só vamos implementar nossa aplicação para experimentar o ambiente OoB.

Divida o grid em 2 colunas e 5 linhas e coloque para cada linha da primeira coluna um TextBlock, e nas segunda coluna um TextBlock na primeira linha, um botão na segunda linha, um TextBlock na terceira linha e um StackPanel com orientacao horizontal e dentro um TextBlock e um Botão como na imagem a seguir.

vai ficar assim:

<UserControl x:Class="OoB.MainPage"
             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">
        <Grid Margin="10,25,10,10"
              Background="White">
            <Grid Margin="4"
                  VerticalAlignment="Stretch"
                  HorizontalAlignment="Stretch">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="120" />
                    <ColumnDefinition Width="*" />
                </Grid.ColumnDefinitions>
                <Grid.RowDefinitions>
                    <RowDefinition Height="30" />
                    <RowDefinition Height="30" />
                    <RowDefinition Height="30" />
                    <RowDefinition Height="30" />
                    <RowDefinition Height="*" />
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0"
                           Grid.Column="0"
                           Text="Connection :"
                           VerticalAlignment="Center" />
                <TextBlock Grid.Row="1"
                           Grid.Column="0"
                           Text="Install :"
                           VerticalAlignment="Center" />
                <TextBlock Grid.Row="2"
                           Grid.Column="0"
                           Text="OoB :"
                           VerticalAlignment="Center" />
                <TextBlock Grid.Column="0"
                           Grid.Row="3"
                           Text="Update :"
                           VerticalAlignment="Center" />
                <TextBlock Grid.Column="1"
                           Grid.Row="0"
                           x:Name="Connection"
                           Text="Conected"
                           VerticalAlignment="Center"
                           Foreground="Green" />
                <Button Grid.Column="1"
                        Grid.Row="1"
                        Height="25"
                        x:Name="install"
                        HorizontalAlignment="Left"
                        VerticalAlignment="Center"
                        Width="100"
                        Content="Install"
                        Click="install_Click" />
                <TextBlock Grid.Column="1"
                           Grid.Row="2"
                           x:Name="OoB"
                           Text="InBrowser"
                           VerticalAlignment="Center" />
                <StackPanel Grid.Column="1"
                            Grid.Row="3"
                            Orientation="Horizontal">
                    <TextBlock x:Name="updated"
                               VerticalAlignment="Center"
                               Text="no update available" />
                    <Button Content="Update"
                            Height="25"
                            x:Name="update"
                            Width="100"
                            Margin="10,0,10,0"
                            VerticalAlignment="Center"
                            Click="update_Click"
                            Visibility="Collapsed" />
                </StackPanel>
            </Grid>
        </Grid>
    </Grid>
</UserControl>

E no .cs :

using System.Net.NetworkInformation;
using System.Runtime.InteropServices.Automation;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

namespace OoB
{
    public partial class MainPage : UserControl
    {
        #region [ _Connection ]

        public static readonly DependencyProperty _ConnectionProperty =
            DependencyProperty.Register(
                name: "_Connection",
                propertyType: typeof(bool),
                ownerType: typeof(MainPage),
                typeMetadata: new PropertyMetadata(
                    defaultValue: true,
                    propertyChangedCallback: new PropertyChangedCallback(_ConnectionPropertyChanged)
                    )
                );

        public bool _Connection
        {
            get { return (bool)GetValue(MainPage._ConnectionProperty); }
            set { SetValue(MainPage._ConnectionProperty, value); }
        }

        private static void _ConnectionPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            if (o != null &amp;&amp; o is MainPage)
            {
                MainPage current = o as MainPage;
                if (current._Connection)
                {
                    current.Connection.Text = "Connected";
                    current.Connection.Foreground = new SolidColorBrush(Colors.Green);
                }
                else
                {
                    current.Connection.Text = "Disconnected";
                    current.Connection.Foreground = new SolidColorBrush(Colors.Red);
                }
            }
        }

        #endregion [ _Connection ]

        #region [ _Installed ]

        public static readonly DependencyProperty _InstalledProperty =
            DependencyProperty.Register(
                name: "_Installed",
                propertyType: typeof(bool),
                ownerType: typeof(MainPage),
                typeMetadata: new PropertyMetadata(
                    defaultValue: false,
                    propertyChangedCallback: new PropertyChangedCallback(_InstalledPropertyChanged)
                    )
                );

        public bool _Installed
        {
            get { return (bool)GetValue(MainPage._InstalledProperty); }
            set { SetValue(MainPage._InstalledProperty, value); }
        }

        private static void _InstalledPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            if (o != null &amp;&amp; o is MainPage)
            {
                MainPage current = o as MainPage;
                if (current._Installed)
                {
                    current.install.Content = "Uninstall";
                }
                else
                {
                    current.install.Content = "Install";
                }
                if (current._OoB)
                {
                    current.install.Visibility = Visibility.Visible;
                }
                else
                {
                    current.install.Visibility = Visibility.Collapsed;
                }
            }
        }

        #endregion [ _Installed ]

        #region [ _OoB ]

        public static readonly DependencyProperty _OoBProperty =
            DependencyProperty.Register(
                name: "_OoB",
                propertyType: typeof(bool),
                ownerType: typeof(MainPage),
                typeMetadata: new PropertyMetadata(
                    defaultValue: false,
                    propertyChangedCallback: new PropertyChangedCallback(_OoBPropertyChanged)
                    )
                );

        public bool _OoB
        {
            get { return (bool)GetValue(MainPage._OoBProperty); }
            set { SetValue(MainPage._OoBProperty, value); }
        }

        private static void _OoBPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            if (o != null &amp;&amp; o is MainPage)
            {
                MainPage current = o as MainPage;
                if (current._OoB)
                {
                    current.OoB.Text = "Out-of-Browser";
                    current.Foreground = new SolidColorBrush(Colors.Green);
                    current.install.Visibility = Visibility.Visible;
                }
                else
                {
                    current.OoB.Text = "InBrowser";
                    current.Foreground = new SolidColorBrush(Colors.Green);
                    current.install.Visibility = Visibility.Collapsed;
                }
            }
        }

        #endregion [ _OoB ]

        #region [ _Updated ]

        public static readonly DependencyProperty _UpdatedProperty =
            DependencyProperty.Register(
                name: "_Updated",
                propertyType: typeof(bool),
                ownerType: typeof(MainPage),
                typeMetadata: new PropertyMetadata(
                    defaultValue: true,
                    propertyChangedCallback: new PropertyChangedCallback(_UpdatedPropertyChanged)
                    )
                );

        public bool _Updated
        {
            get { return (bool)GetValue(MainPage._UpdatedProperty); }
            set { SetValue(MainPage._UpdatedProperty, value); }
        }

        private static void _UpdatedPropertyChanged(DependencyObject o, DependencyPropertyChangedEventArgs e)
        {
            if (o != null &amp;&amp; o is MainPage)
            {
                MainPage current = o as MainPage;
                if (current._Updated)
                {
                    current.updated.Text = "no update available";
                    current.update.Visibility = Visibility.Collapsed;
                }
                else
                {
                    current.updated.Text = "update available";
                    current.update.Visibility = Visibility.Visible;
                }
            }
        }

        #endregion [ _Updated ]

        public MainPage()
        {
            InitializeComponent();
            Loaded += new RoutedEventHandler(MainPage_Loaded);

            // Verifica o estado da conexão.
            _Connection = NetworkInterface.GetIsNetworkAvailable();
            NetworkChange.NetworkAddressChanged += new NetworkAddressChangedEventHandler(NetworkChange_NetworkAddressChanged);

            // Verifica se esta instalado o OoB.
            _Installed = Application.Current.InstallState == InstallState.Installed;
            Application.Current.InstallStateChanged += new System.EventHandler(Current_InstallStateChanged);

            // Verifica se a aplicação esta rodado fora do browser.
            _OoB = Application.Current.IsRunningOutOfBrowser;

            // Verifica se tem uma versao atualizada do xap no servidor.
            Application.Current.CheckAndDownloadUpdateCompleted += new CheckAndDownloadUpdateCompletedEventHandler(Current_CheckAndDownloadUpdateCompleted);
            Application.Current.CheckAndDownloadUpdateAsync();
        }

        void Current_CheckAndDownloadUpdateCompleted(object sender, CheckAndDownloadUpdateCompletedEventArgs e)
        {
            _Updated = !e.UpdateAvailable;
        }

        void Current_InstallStateChanged(object sender, System.EventArgs e)
        {
            _Installed = Application.Current.InstallState == InstallState.Installed;
        }

        void NetworkChange_NetworkAddressChanged(object sender, System.EventArgs e)
        {
            _Connection = NetworkInterface.GetIsNetworkAvailable();
        }

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {

        }

        private void install_Click(object sender, RoutedEventArgs e)
        {
            if (install.Content.ToString() == "Install")
            {
                Application.Current.Install();
            }
            else
            {
                if (AutomationFactory.IsAvailable)
                {
                    //Para usar o tipo dynamic tem que adicionar as dlls Microsoft.CSharp.dll e System.Core.dll
                    dynamic shell = AutomationFactory.CreateObject("WScript.Shell");
                    var hidden = 0;

                    //em origin colocar o caminho do xap. na minha aplicacao usa a porta 4040.
                    shell.Run("cmd /C \"%programfiles%\\Microsoft Silverlight\\sllauncher.exe\" /uninstall /origin:http://localhost:4040/ClientBin/OoB.xap", hidden);
                    Application.Current.MainWindow.Close();
                }
            }
        }

        private void update_Click(object sender, RoutedEventArgs e)
        {
            /*
             * quando o programa e reiniciado ele faz o download da atualizacao e atualiza.
             */
            MessageBox.Show("Please! Restart the program to upgrade");
        }
    }
}

Pronto, agora e so testar a aplicação.

Download do código fonte aqui.

Anúncios

Ações

Information

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s




%d blogueiros gostam disto: