2012-05-14 1 views
7

У меня есть одна кодовая база, которая может устанавливать приложение OOB SL5 в различных конфигурациях. Основываясь на конфигурации во время выполнения (выбранном параметрами init), я хотел бы обновить настройки OOB (заголовок, заголовок окна) до выполнения установки. Похоже, что единственный путь - через файл OutOfBrowserSettings.xml (или пользовательский интерфейс настройки проекта) во время компиляции. Я что-то упустил или это так, как есть?Могу ли я изменить настройки Silverlight вне браузера во время выполнения?

ответ

2

В соответствии с MSDN вы можете это сделать.

Чтобы настроить существующее приложение для поддержки без браузера без повторной компиляции, добавьте XML-конфигурацию в манифест в существующий .xap-файл. Для этого скопируйте элемент свойства Deployment.OutOfBrowserSettings из следующего примера кода в файл манифеста и затем обновите значения.

В качестве альтернативы дизайнеру вы можете указать параметры вне браузера, заполнив шаблон манифеста (AppManifest.xml в папке «Свойства» или «Мой проект»), как показано в следующем примере. По умолчанию сборка использует шаблон манифеста для создания манифеста приложения. Однако шаблон XML проще использовать в Visual Studio.

Источник: http://msdn.microsoft.com/en-us/library/dd833073(v=vs.95).aspx

Помните, что * .xap файл является простой зип. Таким образом, вы можете извлечь его, изменить, а затем снова закрепить его. Кажется довольно простым для автоматизации.

Вы также можете изменить название приложения во время выполнения (я не знаю, как изменить значок или описание, но я думаю, что woulndt имеет смысл в любом случае) путем реализации вашего собственного хромированного окна. Для примера реализации следует this

Для локализации названия вы должны изменить значение заголовка, для связывания, и привязать его к вашему ресурсу (все коды некоторые настройки проекта образца из указанных выше ссылки):

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> 

Добавлен файл 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> 

Это очень простой пример, чтобы показать, что вы можете изменить название во время выполнения. Im assmuming, что если у вас есть заголовок, открытый как свойство bindable, то вы узнаете, как реализовать свою собственную локализацию.

Для выполнения вышеуказанного примера вам необходимо добавить «en-GB; pl-PL» в тег SupportedCultrues в файле проекта (* .csproj).

+0

Спасибо за ответ. Это отлично подходит для изменения файла XAP перед развертыванием, но помните, что мне нужно иметь возможность изменять текущие настройки OOB _at runtime_ при их установке. –

+0

Хорошо, я понял. Ну, он не поддерживается по умолчанию, вам нужно будет создать собственное окно. Взгляните [здесь] (http: //www.codeproject.com/Articles/68955/Silverlight-4-How-Can-I-Create-a-Customized-OOB-Wi) – Botis

+0

Это все равно не достигнет того, что мне нужно (хотя я вижу, может быть, мой вопрос был недостаточно ясным) , Позвольте мне привести лучший пример: один файл XAP может обслуживать несколько языков, переключая файлы ресурсов во время выполнения. Если пользователь решает установить это приложение OOB, хотя только название, описание и значок, которые они видят, будут тем, что выходит из манифеста. Мне нужно адаптировать заголовок, который показывает с установленным приложением текущую локаль, как это делают строки приложения. –