У меня есть одна кодовая база, которая может устанавливать приложение OOB SL5 в различных конфигурациях. Основываясь на конфигурации во время выполнения (выбранном параметрами init), я хотел бы обновить настройки OOB (заголовок, заголовок окна) до выполнения установки. Похоже, что единственный путь - через файл OutOfBrowserSettings.xml (или пользовательский интерфейс настройки проекта) во время компиляции. Я что-то упустил или это так, как есть?Могу ли я изменить настройки Silverlight вне браузера во время выполнения?
ответ
В соответствии с 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).
Спасибо за ответ. Это отлично подходит для изменения файла XAP перед развертыванием, но помните, что мне нужно иметь возможность изменять текущие настройки OOB _at runtime_ при их установке. –
Хорошо, я понял. Ну, он не поддерживается по умолчанию, вам нужно будет создать собственное окно. Взгляните [здесь] (http: //www.codeproject.com/Articles/68955/Silverlight-4-How-Can-I-Create-a-Customized-OOB-Wi) – Botis
Это все равно не достигнет того, что мне нужно (хотя я вижу, может быть, мой вопрос был недостаточно ясным) , Позвольте мне привести лучший пример: один файл XAP может обслуживать несколько языков, переключая файлы ресурсов во время выполнения. Если пользователь решает установить это приложение OOB, хотя только название, описание и значок, которые они видят, будут тем, что выходит из манифеста. Мне нужно адаптировать заголовок, который показывает с установленным приложением текущую локаль, как это делают строки приложения. –