2012-05-14 85 views
7

我有一個代碼庫,可以在各種配置中安裝OOB SL5應用程序。基於運行時配置(由init參數選擇),我想在執行安裝之前更新OOB設置(標題,窗口標題)。看起來唯一的方法是在編譯時通過OutOfBrowserSettings.xml文件(或項目設置UI)。我是否錯過了某些東西,或者僅僅是這樣?我可以在運行時更改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文件是一個簡單的拉鍊。所以你可以提取它,修改,然後再壓縮它。似乎非常簡單的自動化。

通過實現自己的chrome窗口,您還可以在運行時更改應用程序的標題(我不知道如何更改圖標或描述,但我認爲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> 

這是非常簡單的示例,展示,你可以在運行時更改標題。我暗示,如果你將標題暴露爲可綁定屬性,那麼你將知道如何實現你自己的本地化。

要使上述示例正常工作,需要在項目文件(* .csproj)的SupportedCultrues標記中添加「en-GB; pl-PL」。

+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,則他們看到的唯一標題,說明和圖標將是清單中出現的內容。我需要將顯示的標題和已安裝的應用程序調整到當前語言環境,就像應用程序字符串一樣。 –

相關問題