2012-05-14 12 views
7

Ich habe eine einzige Codebasis, die eine OOB SL5 App in verschiedenen Konfigurationen installieren kann. Basierend auf der Konfiguration zur Laufzeit (ausgewählt durch init-Parameter) möchte ich die OOB-Einstellungen (Titel, Fenstertitel) vor der Installation aktualisieren. Es scheint, dass der einzige Weg über die OutOfBrowserSettings.xml-Datei (oder die Projekteinstellungen-Benutzeroberfläche) zum Zeitpunkt der Kompilierung erfolgt. Fehle ich etwas oder ist das genau so?Kann ich die Silverlight Out-of-Browser-Einstellungen zur Laufzeit ändern?

Antwort

2

Nach MSDN können Sie das tun.

Zum Konfigurieren einer vorhandenen Anwendung für die Unterstützung außerhalb des Browsers ohne erneute Kompilierung fügen Sie das Konfigurations-XML zum Manifest in einer vorhandenen .xap-Datei hinzu. Kopieren Sie dazu das Property Element Deployment.OutOfBrowserSettings aus dem folgenden Beispielcode in die Manifestdatei, und aktualisieren Sie dann die Werte.

Als Alternative zum Designer können Sie die Einstellungen außerhalb des Browsers angeben, indem Sie die Manifestvorlage (AppManifest.xml im Ordner "Properties" oder "Mein Projekt") wie im folgenden Beispiel gezeigt ausfüllen. Standardmäßig verwendet der Build die Manifestvorlage, um das Anwendungsmanifest zu generieren. Das Vorlagen-XML ist jedoch einfacher in Visual Studio zu verwenden.

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

Denken Sie daran, dass die * XAP-Datei eine einfache Zip ist. So können Sie es extrahieren, ändern und dann erneut zippen. Scheint ziemlich einfach zu automatisieren.

Sie können auch den Titel der Anwendung zur Laufzeit ändern (ich weiß nicht, wie man das Symbol oder die Beschreibung ändert, aber ich denke, dass wouldt sowieso Sinn haben), indem Sie Ihr eigenes Chromfenster implementieren. Für Beispielimplementierung folgen this

Titel lokalisieren würden Sie den Wert des Titels ändern müssen, um die Bindung, und binden Sie es an Ihre Ressource (alle Code einige Anpassung von Beispielprojekt von Link oben):

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> 

Hinzugefügt Datei ResourceMock.cs:

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> 

Dies ist sehr einfach Probe, um zu zeigen, dass Sie den Titel während der Laufzeit ändern können. Wenn Sie Titel als bindbare Eigenschaft verfügbar gemacht haben, wissen Sie, wie Sie Ihre eigene Lokalisierung implementieren können.

Damit das obige Beispiel funktioniert, müssen Sie dem Tag SupportedCultrues in der Projektdatei (* .csproj) "en-GB; pl-PL" hinzufügen.

+0

Danke für die Antwort. Dies funktioniert gut, um die XAP-Datei vor der Bereitstellung zu ändern. Beachten Sie jedoch, dass ich die aktuellen OOB-Einstellungen _bei Laufzeit_ bei der Installation ändern muss. –

+0

Ok, ich verstehe es jetzt. Nun, es wird nicht standardmäßig unterstützt, Sie müssten ein benutzerdefiniertes Fenster erstellen. Sehen Sie [hier] (http: //www.codeproject.com/Artikel/68955/Silverlight-4-How-Can-I-Erstellen-ein-Kunden-OOB-Wi) – Botis

+0

Das würde immer noch nicht das erreichen, was ich brauche (obwohl ich sehen kann, vielleicht war meine Frage nicht klar genug) . Lassen Sie mich ein besseres Beispiel geben: Eine einzelne XAP-Datei kann mehrere Sprachen bedienen, indem sie Ressourcen zur Laufzeit wechselt. Wenn der Benutzer jedoch entscheidet, diese App-OOB zu installieren, werden nur der Titel, die Beschreibung und das Symbol angezeigt, die aus dem Manifest stammen. Ich muss den Titel, der mit der installierten App angezeigt wird, an das aktuelle Gebietsschema anpassen, genau wie die Anwendungszeichenfolgen. –

Verwandte Themen