Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Dynamically loading resource dictionary files to a wpf application gives an error

I am trying to add a xaml resource file dynamically using the statement,

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri("resources/leaf_styles.xaml", UriKind.Relative) });

This is throwing an exception, Cannot locate resource 'resources/leaf_styles.xaml'.

I added the leaf_styles.xaml file to the project under resource folder and the BuildAction is set to "Content", CopyAlways is set to True. Still I get this error. Could some one help me out pointing whats wrong??

Additional information -

  • I don't want to embed the xaml file as a resource
  • The current project is a .net 3.5 class library project
  • The above mergedictionary statement is written in a class belonging to the same project
  • I also added the [assembly: AssemblyAssociatedContentFile("resources/leaf_styles.xaml")] manually once I figured that this is not working (for testing)

Update

If I give it as an absolute location, it is working properly.

Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = new Uri(@"D:\foo\trunk\bin\resources\leaf_styles.xaml", UriKind.Absolute) });
like image 824
sudarsanyes Avatar asked May 17 '11 12:05

sudarsanyes


2 Answers

At last, it worked. Here is what I did,

  1. Went thru' http://msdn.microsoft.com/en-us/library/aa970069.aspx.
  2. Changed the Uri pattern to

    var foo = new Uri("pack://siteoforigin:,,,/resources/leaf_styles.xaml", UriKind.RelativeOrAbsolute);
    Application.Current.Resources.MergedDictionaries.Add(new ResourceDictionary() { Source = foo });
    
like image 63
sudarsanyes Avatar answered Sep 20 '22 16:09

sudarsanyes


To load a content file, you can call the GetContentStream method of the Application class, passing a pack URI that identifies the desired content file.

Checkout

http://msdn.microsoft.com/en-us/library/aa970494.aspx#Content_Files

EDIT

I did it successfully like this

    Uri uri = new Uri("Resources/MyDict.xaml", UriKind.Relative);
    StreamResourceInfo info = Application.GetContentStream(uri);
    System.Windows.Markup.XamlReader reader = new System.Windows.Markup.XamlReader();
    ResourceDictionary myResourceDictionary = 
                                   (ResourceDictionary)reader.LoadAsync(info.Stream);
    Application.Current.Resources.MergedDictionaries.Add(myResourceDictionary);
like image 30
biju Avatar answered Sep 20 '22 16:09

biju