2012-05-14 19 views
7

Mam jedną bazę kodów, która może zainstalować aplikację OOB SL5 w różnych konfiguracjach. W oparciu o konfigurację w czasie wykonywania (wybraną przez parametry init) chciałbym zaktualizować ustawienia OOB (tytuł, tytuł okna) przed wykonaniem instalacji. Wydaje się, że jedynym sposobem jest użycie pliku OutOfBrowserSettings.xml (lub interfejsu ustawień projektu) podczas kompilacji. Czy brakuje mi czegoś lub czy tak po prostu jest?Czy mogę zmienić ustawienia Silverlight poza przeglądarką w czasie wykonywania?

Odpowiedz

2

Według MSDN można to zrobić.

Aby skonfigurować istniejącą aplikację do obsługi poza przeglądarką bez ponownej kompilacji, dodaj plik konfiguracyjny XML do pliku manifestu w istniejącym pliku .xap. Aby to zrobić, skopiuj element właściwości Deployment.OutOfBrowserSettings z poniższego przykładowego kodu do pliku manifestu, a następnie zaktualizuj wartości.

Jako alternatywa dla projektanta można określić ustawienia poza przeglądarką, wypełniając szablon manifestu (AppManifest.xml w folderze Właściwości lub Mój projekt), jak pokazano w poniższym przykładzie. Domyślnie kompilacja używa szablonu manifestu do generowania manifestu aplikacji. Jednak szablon XML jest prostszy w użyciu w Visual Studio.

Źródło: http://msdn.microsoft.com/en-us/library/dd833073(v=vs.95).aspx

Pamiętaj, że plik * .xap jest prosty zip. Możesz go więc wyodrębnić, zmodyfikować, a następnie ponownie skompresować. Wydaje się dość proste do zautomatyzowania.

Możesz także zmienić tytuł aplikacji w czasie wykonywania (nie wiem, jak zmienić ikonę lub opis, ale myślę, że i tak nie mam sensu) przez zaimplementowanie własnego okna chrome. Dla realizacji próbki śledzić this

Aby zlokalizować tytuł trzeba by zmienić wartość tytule, do wiązania i powiązać go do zasobu (cały kod jest pewne dostosowanie projektu próbki z wyżej link):

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> 

Dodano ResourceMock.cs plików:

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> 

Jest to bardzo prosty przykład, aby pokazać, że można zmienić tytuł na starcie. Im assmuming, że jeśli masz tytuł ujawniony jako właściwość bindable, to będziesz wiedział, jak zaimplementować własną lokalizację.

Aby powyższa próbka działała, należy dodać "en-GB; pl-PL" do znacznika SupportedCultrues w pliku projektu (* .csproj).

+0

Dzięki za odpowiedź. To działa dobrze, modyfikując plik XAP przed wdrożeniem, ale pamiętaj, że muszę mieć możliwość modyfikowania bieżących ustawień OOB _at runtime_ podczas instalacji. –

+0

Ok, rozumiem. Cóż, domyślnie nie jest obsługiwana, dlatego musisz utworzyć niestandardowe okno. Spójrz [tutaj] (http: //www.codeproject.com/Articles/68955/Silverlight-4-How-Can-I-Create-a-Custom-OOB-Wi) – Botis

+0

Wciąż nie osiągnęłbym tego, czego potrzebuję (choć widzę, że moje pytanie nie było wystarczająco jasne) . Pozwolę sobie podać lepszy przykład: Jeden pojedynczy plik XAP może obsługiwać wiele języków, zmieniając pliki zasobów w środowisku wykonawczym. Jeśli użytkownik zdecyduje się zainstalować tę aplikację, tylko tytuł, opis i ikona będą widoczne w manifeście. Muszę dostosować tytuł, który wyświetla się z zainstalowaną aplikacją do bieżącego locale, tak jak robią to ciągi aplikacji. –

Powiązane problemy