views:

638

answers:

3

I'm starting to develop a Desktop application using WPF (.net 3.5 sp1, with VS only, not blend as yet).

I'm at the point were I have some generic reusable components in several libraries.

Where can I define my Styles & Data Templates so that they are reusable across several projects, so I can have a consistent look and feel?

I've looked at ResourceDictionaries, but am unsure that

  1. They're what I need
  2. If they are what I need, how I can 'import' them into other project and reference their contents in Xaml.

Thanks,

A: 

You want merged resource dictionaries, as described here.

Bryce Kahle
+4  A: 

ResourceDictionary is the way to go, you can either copy an xaml file containing the resource dictionary between projects or compile them into a DLL you'll reference from your projects.

To reference dictionaries in the same project you add something like this to your App.xaml (in this case I keep my resources in the ControlStyles folder).

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="ControlStyles/Colors.xaml"/>
            <ResourceDictionary Source="ControlStyles/Window.xaml"/>
            <ResourceDictionary Source="ControlStyles/Button.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

If you compile them into a different dll you can use this syntax (if the styles dll is called StyleAssembly, the word "component" is actually part of the syntax and not a directory name):

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/StyleAssembly;component/ControlStyles/Colors.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/StyleAssembly;component/ControlStyles/Window.xaml"/>
            <ResourceDictionary Source="pack://application:,,,/StyleAssembly;component/ControlStyles/Button.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>
Nir
Yer only a Star, thanks :)
Binary Worrier
A: 

@Nir is right, the only thing I like to do as well is to replace

 <ResourceDictionary Source="pack://application:,,,/StyleAssembly;component/ControlStyles/Colors.xaml"/>

with this shorthand

 <ResourceDictionary Source="/StyleAssembly;component/ControlStyles/Colors.xaml"/>

It just looks cleaner to me and the runtime will prefix pack://application:,,, when it tries to locate the resource.

Marthinus