2012-05-14 22 views
7

Tengo una única base de código que puede instalar una aplicación OOB SL5 en varias configuraciones. En función de la configuración en tiempo de ejecución (seleccionada por los parámetros init), me gustaría actualizar la configuración OOB (título, título de la ventana) antes de realizar la instalación. Parece que la única forma es mediante el archivo OutOfBrowserSettings.xml (o la interfaz de usuario de configuración del proyecto) en tiempo de compilación. ¿Me estoy perdiendo algo o es así como es?¿Puedo cambiar la configuración de Silverlight fuera del navegador en tiempo de ejecución?

Respuesta

2

Según MSDN, puede hacerlo.

Para configurar una aplicación existente para compatibilidad con fuera del navegador sin volver a compilar, agregue el XML de configuración al manifiesto en un archivo .xap existente. Para ello, copie el elemento de propiedad Deployment.OutOfBrowserSettings del siguiente código de ejemplo en el archivo de manifiesto y luego actualice los valores.

Como alternativa al diseñador, puede especificar la configuración de fuera del navegador rellenando la plantilla del manifiesto (AppManifest.xml en la carpeta Propiedades o Mi proyecto) como se muestra en el siguiente ejemplo. Por defecto, la compilación usa la plantilla de manifiesto para generar el manifiesto de la aplicación. Sin embargo, la plantilla XML es más fácil de usar en Visual Studio.

Fuente: http://msdn.microsoft.com/en-us/library/dd833073(v=vs.95).aspx

Recuerde que el archivo * .xap es una postal simple. Entonces puede extraerlo, modificarlo y luego volverlo a comprimir. Parece bastante simple de automatizar.

También puede cambiar el título de la aplicación en tiempo de ejecución (no sé cómo cambiar el icono o la descripción, pero creo que no tendrá sentido de todos modos) implementando su propia ventana de Chrome. Para la implementación de Muestra se this

Para localizar título que tendría que cambiar el valor del título, a la unión, y enlazarlo a su recurso (todo el código es algún tipo de personalización del proyecto de ejemplo de enlace de arriba):

MainPage .xaml:

<UserControl 
    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:local="clr-namespace:Silverlight4.OOB.ChromelessWindow.Demo" x:Class="Silverlight4.OOB.ChromelessWindow.Demo.MainPage" 
mc:Ignorable="d" 
d:DesignHeight="300" d:DesignWidth="400" MinWidth="400" MinHeight="300"> 
<Grid x:Name="LayoutRoot" Background="White"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition/> 
    </Grid.RowDefinitions>   
    <Border BorderBrush="Black" BorderThickness="1" Margin="0,-25,0,0" Grid.Row="1"/> 
    <local:ControlBar x:Name="ucControlBar" VerticalAlignment="Top" Title="{Binding Source={StaticResource resxWrapper}, Path=Title}"></local:ControlBar> 
    <Border BorderBrush="Black" BorderThickness="1" CornerRadius="10" Grid.Row="1" Margin="10"> 
     <Border.Background> 
      <LinearGradientBrush EndPoint="0.5,1" MappingMode="RelativeToBoundingBox" StartPoint="0.5,0"> 
       <GradientStop Color="#FFFDC97A"/> 
       <GradientStop Color="White" Offset="0.5"/> 
       <GradientStop Color="#FFFDC97A" Offset="1"/> 
      </LinearGradientBrush> 
     </Border.Background> 

    </Border> 
    <ComboBox SelectionChanged="ComboBox_SelectionChanged" Grid.Row="1" Height="20"> 
     <ComboBoxItem Content="pl-PL" /> 
     <ComboBoxItem Content="en-GB" /> 
    </ComboBox> 
    <TextBlock x:Name="txtTitle" HorizontalAlignment="Center" Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Top" FontSize="32" Text="Silverlight 4 Custom Out-Of-Browser Window Demo" Margin="10" TextAlignment="Center" Foreground="#FF5A098F"/> 
    <TextBlock x:Name="txtInfo" HorizontalAlignment="Center" Grid.Row="1" TextWrapping="Wrap" Text="You are running inside Browser Window" VerticalAlignment="Bottom" Margin="10" FontSize="24" TextAlignment="Center"/>   
</Grid> 

Añadido ResourceMock.cs archivo:

public class ResourceMock:INotifyPropertyChanged 
{ 
    public string Title 
    { 
     get 
     { 
      MessageBox.Show(Thread.CurrentThread.CurrentCulture.Name); 
      switch (Thread.CurrentThread.CurrentCulture.Name) 
      { 
       case "en-GB": return "English"; break; 
       case "pl-PL": return "Polish"; break; 
       default: return "default"; 
        break; 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    public void firePropertyChanged(string property) 
    { 
     OnPropertyChanged(property); 
    } 
} 

MainPage.xaml.cs:

public partial class MainPage : UserControl 
{ 
    public MainPage() 
    { 
     InitializeComponent(); 

     if (App.IsRunningOOBWithPermission) 
     { 
      txtInfo.Text = "You are running outside Browser Window."; 
     } 
     else 
     { 
      txtInfo.Text = "You are running inside Browser Window."; 
     } 
    } 

    private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    { 
     var cultrue = (e.AddedItems[0] as ComboBoxItem).Content.ToString(); 
     try 
     { 
      Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(cultrue); 
      var res = App.Current.Resources["resxWrapper"] as ResourceMock; 
      res.firePropertyChanged("Title"); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.ToString()); 
     } 
    } 


} 

App.xaml:

<Application xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="Silverlight4.OOB.ChromelessWindow.Demo.App" 
     xmlns:loc="clr-namespace:Silverlight4.OOB.ChromelessWindow.Demo" 
     > 
    <Application.Resources> 
     <loc:ResourceMock x:Key="resxWrapper"></loc:ResourceMock> 
    </Application.Resources> 
</Application> 

Esto es muy simple muestra, para mostrar, que se puede cambiar el título en tiempo de ejecución. Asumo que si tiene el título expuesto como propiedad enlazable, sabrá cómo implementar su propia localización.

Para que la muestra anterior funcione, debe agregar "en-GB; pl-PL" a la etiqueta SupportedCultrues, en el archivo de proyecto (* .csproj).

+0

Gracias por la respuesta. Esto funciona bien para modificar el archivo XAP antes de implementarlo, pero recuerde que necesito poder modificar la configuración actual de OOB _at runtime_ cuando se instalen. –

+0

Ok, lo entiendo ahora. Bueno, no es compatible por defecto, tendría que crear una ventana personalizada. Eche un vistazo [aquí] (http: //www.codeproject.com/Articles/68955/Silverlight-4-How-Can-I-Create-a-Customized-OOB-Wi) – Botis

+0

Eso todavía no lograría lo que necesito (aunque puedo ver que tal vez mi pregunta no era lo suficientemente clara) . Permítanme dar un mejor ejemplo: un solo archivo XAP puede servir en varios idiomas al cambiar los archivos de recursos en tiempo de ejecución. Sin embargo, si el usuario decide instalar esa aplicación OOB, el único título, descripción e icono que verá será lo que salga del manifiesto. Necesito adaptar el título que se muestra con la aplicación instalada a la configuración regional actual, tal como lo hacen las cadenas de aplicaciones. –

Cuestiones relacionadas