Reputation: 5084
In our project we have a ResourceDictionary
with some Icons that looks like this:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Canvas x:Key="Icon.Refresh"
x:Shared="False"
Width="32"
Height="32"
Clip="F1 M 0,0L 32,0L 32,32L 0,32L 0,0">
<Path .../>
<Path .../>
<Path .../>
</Canvas>
</ResourceDictionary>
The x:Shared="False"
attribute is needed, because else the icon would disappear when I use it in multiple views.
Now we want to make another project with the same icons, so we decided to put them in a library project that is referenced by both projects.
But when we try to run the application we always get the error:
Shared attribute in namespace "http://schemas.microsoft.com/winfx/2006/xaml" can be used only in compiled resource dictionaries."
but we can't get rid of the x:Shared="False"
attribute, because as far as I know it's the only way to stop the icons from disappearing.
So we what can we do, to share the icons over multiple projects with a project reference and without disappearing icons?
Upvotes: 8
Views: 5572
Reputation: 31721
I am not sure if I ran into something similar but this strikes a chord. The advice learned and now given is to change the container. Use a DrawingImage which will contain the multiple vectors which itself resides in the shared dictionary.
<DrawingImage x:Key="diSingle">
<DrawingImage.Drawing>
<DrawingGroup>
<GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 14.72,15.68L 12.38,15.68L 7.205,5.92L 7.11,5.92L 2.29,15.68L 0,15.68L 6.58,2.56L 7.595,2.56L 14.72,15.68 Z "/>
<GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 21.585,25.6C 21.1017,25.6 20.69,25.4275 20.35,25.0825C 20.01,24.7375 19.84,24.3267 19.84,23.85C 19.84,23.37 20.01,22.955 20.35,22.605C 20.69,22.255 21.1017,22.08 21.585,22.08C 22.0783,22.08 22.4975,22.255 22.8425,22.605C 23.1875,22.955 23.36,23.37 23.36,23.85C 23.36,24.3267 23.1875,24.7375 22.8425,25.0825C 22.4975,25.4275 22.0783,25.6 21.585,25.6 Z "/>
<GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 28.625,25.6C 28.1417,25.6 27.73,25.4275 27.39,25.0825C 27.05,24.7375 26.88,24.3267 26.88,23.85C 26.88,23.37 27.05,22.955 27.39,22.605C 27.73,22.255 28.1417,22.08 28.625,22.08C 29.1183,22.08 29.5375,22.255 29.8825,22.605C 30.2275,22.955 30.4,23.37 30.4,23.85C 30.4,24.3267 30.2275,24.7375 29.8825,25.0825C 29.5375,25.4275 29.1183,25.6 28.625,25.6 Z "/>
<GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 35.665,25.6C 35.1817,25.6 34.77,25.4275 34.43,25.0825C 34.09,24.7375 33.92,24.3267 33.92,23.85C 33.92,23.37 34.09,22.955 34.43,22.605C 34.77,22.255 35.1817,22.08 35.665,22.08C 36.1583,22.08 36.5775,22.255 36.9225,22.605C 37.2675,22.955 37.44,23.37 37.44,23.85C 37.44,24.3267 37.2675,24.7375 36.9225,25.0825C 36.5775,25.4275 36.1583,25.6 35.665,25.6 Z "/>
<GeometryDrawing Brush="#FF22BAFD" Geometry="F1 M 48.96,25.155L 48.96,28.48L 47.36,28.48L 47.36,25.28C 45.1267,25.28 43.3133,24.8217 41.92,23.905L 41.92,21.12C 42.5267,21.6633 43.3567,22.1192 44.41,22.4875C 45.4633,22.8558 46.4467,23.04 47.36,23.04L 47.36,15.14C 45.08,14.04 43.6033,13.0258 42.93,12.0975C 42.2567,11.1692 41.92,10.0717 41.92,8.805C 41.92,7.30167 42.4325,6.0025 43.4575,4.9075C 44.4825,3.8125 45.7833,3.15667 47.36,2.94L 47.36,9.53674e-007L 48.96,9.53674e-007L 48.96,2.88C 51.12,2.94333 52.6133,3.23333 53.44,3.75L 53.44,6.4C 52.3167,5.60667 50.8233,5.18 48.96,5.12L 48.96,13.24C 51.1733,14.27 52.6867,15.2658 53.5,16.2275C 54.3133,17.1892 54.72,18.2833 54.72,19.51C 54.72,20.9867 54.2117,22.2267 53.195,23.23C 52.1783,24.2333 50.7667,24.875 48.96,25.155 Z M 47.36,12.37L 47.36,5.215C 46.4733,5.38833 45.7717,5.76917 45.255,6.3575C 44.7383,6.94583 44.48,7.66 44.48,8.5C 44.48,9.38 44.6908,10.1017 45.1125,10.665C 45.5342,11.2283 46.2833,11.7967 47.36,12.37 Z M 48.96,15.945L 48.96,22.915C 51.0933,22.4817 52.16,21.4133 52.16,19.71C 52.16,18.29 51.0933,17.035 48.96,15.945 Z "/>
</DrawingGroup>
</DrawingImage.Drawing>
</DrawingImage>
Then access the image as a dynamic resource (bound at runtime) in a container such as this ribbon button:
<RibbonToggleButton x:Name="btnSingleline"
IsChecked="{Binding RegexOption_Single, Mode=TwoWay}"
Label="Single Line"
LargeImageSource="{DynamicResource diSingle}"
SmallImageSource="{DynamicResource dilines}"
ToolTipImageSource="{DynamicResource dilines}"/>
See my answer below for a different example using DrawingImage
.
Best way to use a vector image in WPF?
Upvotes: 2
Reputation: 66607
For Reference:
In WPF,
x:Shared
is only valid under the following conditions:
The ResourceDictionary that contains the items with
x:Shared
must be compiled. The ResourceDictionary cannot be within loose XAML or used for themes.The ResourceDictionary that contains the items must not be nested within another ResourceDictionary. For example, you cannot use
x:Shared
for items in a ResourceDictionary that is within a Style that is already a ResourceDictionary item.
https://learn.microsoft.com/en-us/dotnet/framework/xaml-services/x-shared-attribute
Upvotes: 2
Reputation: 22702
Judging by this error, we can understand that x:Shared
attribute can be used only for compiled ResourceDictionary
. Quote from MSDN
x:Shared Attribute:
The
ResourceDictionary
that contains the items withx:Shared
must be compiled. The ResourceDictionary cannot be within loose XAML or used for themes.
Compiled ResourceDictionary
is one that Build action
to set Page
, as in this case, it is converted to BAML (Binary Application Markup Language) at run-time. This attribute usually be set by default when creating new ResourceDictionary
.
BAML
is simply XAML that has
been parsed, tokenized, and converted into binary form to increase performance for working with XAML files. Quote from Adam Nathan WPF book:
BAML is not like Microsoft intermediate language (MSIL); it is a compressed declarative format that is faster to load and parse (and smaller in size) than plain XAML. BAML is basically an implementation detail of the XAML compilation process.
Therefore it is always advisable to check this flag in ResourceDictionary
, because if it will be set Resource
, in the memory will be stored not packaged version of XAML, which later may affect to the performance of the whole WPF application.
Upvotes: 11
Reputation: 12540
Could you try setting the Build action to "Page" instead of "Resources", as mentioned here:
Upvotes: 3