我能在运行时更改Silverlight离线设置吗?

7
我有一个单一的代码库,可以在各种配置下安装OOB SL5应用程序。根据运行时的配置(通过init参数选择),我想在执行安装之前更新OOB设置(标题,窗口标题)。看起来唯一的方法是通过OutOfBrowserSettings.xml文件(或项目设置UI)在编译时进行。我是否遗漏了什么,还是这就是现状?
1个回答

2
根据MSDN,您可以这样做。
要为现有应用程序配置支持浏览器外运行而无需重新编译,请将配置XML添加到现有.xap文件中的清单中。为此,请从以下示例代码中复制Deployment.OutOfBrowserSettings属性元素到清单文件中,然后更新值。
作为设计师的替代方案,您可以像以下示例中所示填充清单模板(属性或我的项目文件夹中的AppManifest.xml)来指定浏览器外设置。默认情况下,生成使用清单模板生成应用程序清单。但是,在Visual Studio中使用模板XML更简单。
来源:http://msdn.microsoft.com/en-us/library/dd833073(v=vs.95).aspx 请记住,*.xap文件是一个简单的zip文件。因此,您可以提取它,修改它,然后再次压缩它。似乎很容易自动化。
您还可以通过实现自己的Chrome窗口在运行时更改应用程序的标题(我不知道如何更改图标或描述,但我认为这也没有意义)。有关示例实现,请参阅此链接: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”。


感谢您的回复。这对于在部署之前修改XAP文件非常有效,但请记住,我需要能够在安装时在运行时修改当前的OOB设置。 - Arian Kulp
好的,我现在明白了。嗯,它不是默认支持的,你需要创建一个自定义窗口。看一下这里 - macwier
这仍然无法达到我所需的目的(尽管我可以看出我的问题可能不够清楚)。让我举个更好的例子:一个XAP文件可以通过在运行时切换资源文件来为多种语言提供服务。但是,如果用户决定在浏览器之外安装该应用程序,则他们看到的唯一标题、描述和图标将是来自清单的内容。我需要像应用程序字符串一样调整已安装应用程序中显示的标题以适应当前区域设置。 - Arian Kulp
谢谢!但这仍然不是默认设置。我需要显示在桌面快捷方式上的标题和描述。非常感谢您的尝试,我真的很感激您花费时间。 - Arian Kulp
好的,我现在完全理解你的问题了。我认为唯一的解决办法是创建一些代码(在服务器上)来编辑XAP中的AppManifest.xml文件。也许可以通过一些Web服务来根据传递给该服务参数的OOB设置来提供正确的XAP?然后,你可以使用JavaScript将XAP嵌入到HTML页面中。但是我猜实现这样的功能可能需要很多时间。 - macwier
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接