2012-05-14 13 views
7

Ho un codice singolo che può installare un'app OOB SL5 in varie configurazioni. In base alla configurazione in fase di runtime (selezionata dai parametri init) vorrei aggiornare le impostazioni OOB (titolo, titolo della finestra) prima di eseguire l'installazione. Sembra che l'unico modo sia attraverso il file OutOfBrowserSettings.xml (o l'interfaccia utente Impostazioni progetto) al momento della compilazione. Mi sto perdendo qualcosa o è così com'è?Posso modificare le impostazioni di Silverlight out-of-browser in fase di runtime?

risposta

2

Secondo MSDN è possibile farlo.

Per configurare un'applicazione esistente per il supporto fuori dal browser senza ricompilare, aggiungere l'XML di configurazione al file manifest in un file .xap esistente. Per fare ciò, copiare l'elemento della proprietà Deployment.OutOfBrowserSettings dal seguente codice di esempio nel file manifest e quindi aggiornare i valori.

In alternativa al progettista, è possibile specificare le impostazioni out-of-browser popolando il modello manifest (AppManifest.xml nella cartella Proprietà o Progetto) come mostrato nell'esempio seguente. Per impostazione predefinita, la build utilizza il modello manifest per generare il manifest dell'applicazione. Tuttavia, il modello XML è più semplice da utilizzare in Visual Studio.

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

Ricordate, che il file * Xap è una semplice zip. Quindi puoi estrarlo, modificarlo e poi comprarlo di nuovo. Sembra abbastanza semplice da automatizzare.

È anche possibile modificare il titolo dell'applicazione in fase di esecuzione (non so come modificare l'icona o la descrizione, ma penso che abbia comunque senso) implementando la propria finestra di Chrome. Per l'implementazione del campione seguire this

Per localizzare titolo che si dovrebbe cambiare il valore di titolo, al legame, e associarlo alla risorsa (tutto il codice è un po 'di personalizzazione del progetto di esempio dal link qui sotto):

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> 

Aggiunto ResourceMock.cs file:

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> 

Questo è campione molto semplice, per mostrare, che è possibile cambiare il titolo a runtime. Assumendo che se hai titolo esposto come proprietà associabile, allora saprai come implementare la tua localizzazione.

Affinché l'esempio sopra riportato funzioni, è necessario aggiungere "en-GB; pl-PL" al tag SupportedCultrues, nel file di progetto (* .csproj).

+0

Grazie per la risposta. Funziona bene per modificare il file XAP prima della distribuzione, ma ricorda che devo essere in grado di modificare le impostazioni OOB correnti _at runtime_ quando installano. –

+0

Ok, ho capito ora. Bene, non è supportato di default, dovresti creare una finestra personalizzata. Date un'occhiata [qui] (http: //www.codeproject.it/Articoli/68955/Silverlight-4-How-Can-I-Create-a-Custom-OOB-Wi) – Botis

+0

Questo ancora non raggiungerebbe quello che mi serve (anche se posso vedere forse la mia domanda non era abbastanza chiara) . Consentitemi di dare un esempio migliore: un singolo file XAP può servire più lingue commutando i file di risorse in fase di runtime. Se l'utente decide di installare l'app OOB, l'unico titolo, descrizione e icona che vedranno sarà ciò che uscirà dal manifest. Ho bisogno di adattare il titolo che mostra l'app installata alle impostazioni locali correnti proprio come fanno le stringhe dell'applicazione. –