Silverlight动态资源文件位置

时间:2011-03-11 15:16:37

标签: c# silverlight resources

我正在尝试链接到外部文件,就像在已编译的silverlight应用程序中一样,链接到我的资源字典。我希望能够将“主题”放入我网站上的文件夹中,并且无需每次创建新主题时都能重新编译和上传。

我已成功更改资源但我无法找到链接到不在编译应用程序中的文件的方法。

这是我到目前为止所做的:

private void BlueButtonClick(object sender, RoutedEventArgs e)
{
  var s = App.GetResourceStream(new System.Uri("/DynamicDictionary;component/dict2.xaml", System.UriKind.Relative)).Stream;
  var reader = new StreamReader(s);
  var xaml = reader.ReadToEnd();
  var rdd = (ResourceDictionary)XamlReader.Load(xaml);
  Resources.MergedDictionaries.Add(rdd);
  VictoryIsMine();
}

我希望能够将'/DynamicDictionary ;component/dict2.xaml'更改为'http:// localhost:9393 / dict2.xaml',但它给了我一个错误。

有人有任何建议吗?

*编辑**

当我尝试使用localhost引用它时,它给出了以下错误:

  

{System.UriFormatException:一个亲戚   无法创建URI,因为   'uriString'参数代表一个   绝对URI。在   System.Uri.CreateThis(String uri,   布尔dontEscape,UriKind uriKind)
  在System.Uri..ctor(String uriString,   UriKind uriKind)来自   DynamicDictionary.MainPage.RedButtonClick(对象   发件人,RoutedEventArgs e)at   System.Windows.Controls.Primitives.ButtonBase.OnClick()   在   System.Windows.Controls.Button.OnClick()   在   System.Windows.Controls.Primitives.ButtonBase.OnMouseLeftButtonUp(MouseButtonEventArgs   吃   System.Windows.Controls.Control.OnMouseLeftButtonUp(控制   ctrl,EventArgs e)at   MS.Internal.JoltHelper.FireEvent(IntPtr的   unmanagedObj,IntPtr unmanagedObjArgs,   Int32 argsTypeIndex,Int32   actualArgsTypeIndex,String   eventName的)}

1 个答案:

答案 0 :(得分:3)

没有切实可行的方法以您正在寻找的直接方式从文件外部获取它。

我知道有两个选项(不是说没有其他选项,但这是我通常看到的方式):

  1. 您可以使用MEF的DeploymentCatalog或获取WebClient并将其作为程序集加载,使用AssemblyParts将其解析,然后创建资源字典引用并手动将其添加到应用程序的资源集合中

  2. 您可以使用WebClient获取资源的XAML。然后,您可以使用XAML Loader加载和处理它,然后将其添加到资源集合中。然而,这将更加棘手,因为您必须预测XAML中引用的名称空间并确保配置并将它们传递给XAML加载程序

  3. 虽然XAML中的主题看起来“很好”,但XAML只不过是一个声明性对象图。在它下面,它是实际的代码。因此,您必须加载代码才能使主题正常工作,并且将该代码添加到正在运行的部署的唯一方法是将其解析为动态添加的程序集,或者将XAML加载到进程空间并以这种方式添加它。

    PS - 我看到你正在使用一个阅读器,你可能会尝试传入UriKind.Absolute - 如果这不起作用,请使用WebClient并以这种方式传入文本。