Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Use an External ResourceDictionary in a WindowsPhone 7 app

I am trying to create an ResourceFile Called DataTemplate.xaml in an external dll and use that in a WP7 page. When I do the following in the header of my Page I get an error

<ResourceDictionary Source="pack://application:,,,/WP7SharedClassLibrary;component/DataTemplate.xaml" />

The error is "Current project does not support 'application' as the authority component of the pack URI."

Has anyone else come across this and solved this?

like image 750
Derik Whittaker Avatar asked May 20 '10 15:05

Derik Whittaker


2 Answers

I've managed to get this to work using the following steps:

  1. Created a standard WP7 application using the "Windows Phone Application" application template called "WP7ExternalResourcesTest".
  2. Added a project to the same solution using the "Windows Phone Class Library" template called "WP7ExternalResourcesTestLibrary".
  3. Removed the default Class.cs file form the library project.
  4. Added a file called "External.xaml" using the "XML file" template and set the "Build Action" to "Page".
  5. Added the following XAML to the new XAML file:

    <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
        <SolidColorBrush x:Key="ForegroundBrush" Color="Red" />
    </ResourceDictionary>
    
  6. Built the library project, and then added a reference to it from the WP7ExternalResourcesTest project.
  7. In WP7ExternalResourcesTest, opened App.xaml and changed the Application.Resources section to the following:

    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="/WP7ExternalResourcesTestLibrary;component/External.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
    
  8. In MainPage.xaml, added Foreground="{StaticResource ForegroundBrush}" to the TextBlock named "PageTitle".
  9. Ran the application in the emulator. The end result was that the TextBlock correctly displayed the words "page name" in red.

Hope this helps.

like image 72
Derek Lakin Avatar answered Feb 23 '23 11:02

Derek Lakin


I tried the pack syntax while trying to share XAML ResourceDictionary files and got the same error message. I ended up using this syntax and it worked for me.

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="/MyDLLName;component/Folder/MyXAMLFile.xaml"/>                
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
like image 30
Rich Reuter Avatar answered Feb 23 '23 12:02

Rich Reuter