embed project icon in WPF - c#

This problem is getting me crazy, I really have no clue what's going on - why it's not working as I think it should.
I have a WPF C# project. I've added a directory named "ExtFiles" to my solution. This directory contains a ICO file, a PNG image and TTF font.
All three files have "build action" set to "resource", and "copy to output dir" set to "Do not copy".
I call these 3 files in the XAML via:
For the Icon:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="Swiftech_Imperium.MainWindow"
Title="Imp" Height="435" Width="510" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen" Icon="pack://application:,,,/ExtFiles/imp.ico"
For the Image:
<Image HorizontalAlignment="Left" Width="278" Height="30" Margin="9,401,0,0" VerticalAlignment="Top" Source="pack://application:,,,/ExtFiles/Logo.png"/>
And for the font:
<Label x:Name="LabelTemp1" BorderBrush="#FFFFA421" BorderThickness="1" FontFamily="pack://application:,,,/ExtFiles/#DS-Digital" Height="30"
Everything works, no error. The image is displaying, the icon too, the font is working.
But, when I publish, it does generate the ExtFile directory with the icon in it. Why is that? My goal is to have all 3 files embedded in the EXE. My goal is deploy the program using the single EXE file and nothing else, as the users's requirement.
All these 3 files are called only in the XAML and nowhere else, I don't understand why it's working fine for the image and font but not for the icon...
Any idea?
Thanks
Steve
Edit: I tried this: Embed multiple icons in WPF EXE (last answer) but it doesn't work.
Icon="/Resources/Imp.ico"
Source="/Resources/Logo.png"
FontFamily="/Resources/#DS-Digital"
I get this error (only for the icon, If I can the Icon=".." out it starts but the image and the font are not applied...
'System.Windows.Baml2006.TypeConverterMarkupExtension' threw an exception.' Line number '5' and line position '9'.
I added the 3 files as resources (Resource, add file) and set their build action to "resource".
edit:
OK... I moved forward a tiny bit.
I added both DLL's (yeah there two!) to the resources.
Moved the image/icon/font to a separate folder (that probably wasn't needed).
but I was still getting the same error (parsing).
turns out it is my XAML that is calling the second DLL (which I originally forgot to add to the resources).
Now with both DLL's as resources, if I go into References and set both of these DLL's Copy Local to False, I get an error. I can put the first dll (WPFToolkit.dll) to false, but I can't do for system.windows.controls.datavisualization.toolkit.dll :(
reason why is because the XAML is calling it:
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" x:Class="Imperium.MainWindow"
Title="Imperium" Height="435" Width="510" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen" Icon="pack://application:,,,/ExtFiles/Imp.ico" Closing="Window_Closing" MouseDown="Grid_MouseDown" WindowStyle="None" BorderThickness="1" BorderBrush="Black" Foreground="Black">
what can I do?

Your pack URN was wrong for the icon. It should be:
pack://application:,,,/(qualified assembly name i.e. My.Project.Executable);component/ExtFiles/imp.ico
When you add the file to the VS project folder you should set it as Resource with Do Not Copy.
The same applies for the image and the font - tho' I would also say that I've not loaded font using a direct reference like this and I'm not sure it works like this.

Try This:
Doing with Resources would be a different approach to achieve the same task. I would like to provide you a link to read certain msdn articles.
Adding and Editing Resources (Visual C#)

Related

How to use resources (fonts, images, styles) from external library

I'm having problems with loading resources (images, font families, styles) from an external resource dll. I would like to have all resources (images, fonts, styles...) in one resource dll and set them to be accessible over all projects (libraries) in this solution. Those projects in solution are different libraries that are referenced and called by main application.
So far i tried several different propositions how to do it but none of them work.
I'm using Visual studio 2019 and compiling for .net 4.6.2 - if that means something...
First I created an resource library called myapp.resources. Inside this project I have a folder named Fonts and inside that folder is the Lato-Thin font.
Also at the root of the project I created a resource dictionary called Fonts.xaml
-Project
-Fonts
-Lato-Thin.ttf
-Fonts.xaml
the structure of the Fonts.xaml:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:myapp.resources">
<FontFamily x:Key="LatoThin">Fonts/#Lato Thin</FontFamily>
</ResourceDictionary>
In the main app App.xaml I added the loading of that ResourceDictionary:
<ResourceDictionary x:Key="Dict">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="pack://application:,,,/myapp.resources;component/Fonts.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
The last step is adding this fontfamily to label control:
<Label Grid.Row="0" Grid.Column="0" Content="some random text for test" FontFamily="{StaticResource ResourceKey=LatoThin}"/>
But I always get the error that the LatoThin font resource can't be located.
The same error I get with any other resource type like images, styles.
Of course I added the references to projects and every file is where it should be.
The only thing that is working is, for example adding image to buttons in this way.
<syncfusion:ButtonAdv x:Name="btnSelectFile"
Grid.Row="1" Grid.Column="2"
VerticalAlignment="Center" SizeMode="Small"
Height="26" Width="26" Label="Button" Margin="3,3,3,3"
SmallIcon="pack://application:,,,/myapp.resources;component/Images/add.png"/>
I tried to find some complete tutorials to follow but I always have the same error.
So, my question would be: How to solve this?
Thanks for any advice.
Make sure your font file (Lato-Thin.ttf) has its build action set to Resource.
In your Fonts.xaml make sure to use this format:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:myapp.resources">
<FontFamily x:Key="LatoThin">/myapp.resources;component/Fonts/#Lato Thin</FontFamily>
</ResourceDictionary>
Tip: You can remove pack://application:,,, from your URIs to make them shorter.

Can't find "Resources" file in wpf

I'm newbe in WPF.
I need to add reference on the resources file resx and get strings from it.
<Window x:Class="SelectObjectsWindow.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:res="clr-namespace:SelectObjectsWindow.Properties"
Title="{x:Static res:Resources.Res1}" Height="350" Width="525">
<Grid>
....
</Grid>
I got an error: The name "Resources" does not exist in the namespace "clr-namespace:SelectObjectsWindow.Properties".
I was searching information about this and find couple of advises:
Set "public" access modifier of resx file.
Change Build Action property of resx on "Embedded Resource".
So, I did it, but nothing changed.
I checked all namespaces. Seems to be ok.
I don't know, what else I should try.
In .cs i can do this without error
var res = Properties.Resources.Res1;
Do somebody know, what is wrong?
Change access modifier from internal to public, your binding will work.
Try adding an Assembly reference:
xmlns:res="clr-namespace:SelectObjectsWindow.Properties;assembly=[AssemblyName]"
Replace [AssemblyName] with the name of your assembly which can be found by right clicking your project and selecting Properties, go to the Application tab and see Assembly name:

C# xaml image not showing up in application

When I try to display some smaller (72x72) images in my xaml file as a 20x20 image, they work fine, but when I try to use one that's 96x96, they just don't show up. Here is the code:
<Image Source="/Images.Toolbox;component/Images/defaultIcon.jpg" Height="20" Width="20" Stretch="None"/>
This is how it looks like with the 72x72, how I want it to look.
And this is how it looks when I try to use my 96x96 image.
The working one is a .ico, .png also works. The nonworking one is a .jpg, but this shouldn't matter should it?
Visual Studio > Solution Explorer
right-click on the image file > Properties
make sure the Build Action is set to Resource.

Image not displaying at runtime C# WPF

I have been trying to learn C# but I'm coming across a lot of problems. I am trying to display an image in WPF but for some reason, the image won't show! It appears on the Visual Studio editor but when I run the application it doesn't appear.
Here is some of my code:
This is how I'm trying to display the image:
<Image HorizontalAlignment="Left" Height="100" Margin="273,147,0,0"
VerticalAlignment="Top" Width="100" Source="image.jpg"/>
I have also tried using this:
Source="pack://application:,,,/image.jpg"
Thanks for your help!
In your project:
Create a folder say "img", right click on it and select add existing item add image to folder
Go to properties of the added image, set Build Action as Resource.
It worked for me.
In XAML
<Image HorizontalAlignment="Left" Name="MyImg" Height="80" Margin="273,147,0,0"
VerticalAlignment="Top" Width="100" Source="/img/Desert.jpg"/>
If none of these work, try changing the Build Action to Content.
That's what worked for me after struggling for a long time with this.
Go to the properties for the image in Visual Studio and change "Build Action" to "Resource" and "Copy to Output Directory" to "Copy if newer".
I had to do a rebuild, but then it worked. Cred to swapnil.
please drag the image to a image source,it will be like this /img/image.jpg"/
<Image HorizontalAlignment="Left" Height="100" Margin="273,147,0,0"
VerticalAlignment="Top" Width="100" Source="/img/image.jpg"/>
If none of the above works, try Rebuilding your application from the build menu. Not "Build", but "Rebuild"
For example, this is your project structure
+ProjectName
+--+imagesFolder
| +--amogus.png
|
+--App.xaml
+--MainWindow.xaml
+--etc.
and you want to access the to amogus.png in your xaml window,
You have two ways:
note this way the imagesFolder will be visible in the release build to users
to set amogus.png Build Action to Content and
Copy to Output Directory to Copy always more info,
then rebuild from the build menu, then add this to the window xaml
<Image Source="pack://siteoforigin:,,/imagesFolder/amogus.png" ></Image>
note this way the imagesFolder will be not visible in the release build to users
to set amogus.png Build Action to Resource and
Copy to Output Directory to Do not copy or blank more info,
then rebuild from the build menu, then add this to the window xaml
<Image Source="/imagesFolder/amogus.png" ></Image>
more detail
Right click images on the Solution Explorer, choose Properties and then set the Build Action as Resource.
Did not have to do a clean and rebuild. I tried every combination listed above (I am in VS2017)
Go to Project->Properties->Resources
Select File (drop down with choices of strings, images, icons...)
Click Add Resource->Existing File
Navigate to the image and import it
VS identifies it as an image (mine is PNG) and switches the view to show Image resources
Select the thumbnail of the image and in the Properties of the Image (type should be Bitmap) set Persistence to Embedded in resx
I saved and closed Project Properties as I got confused here before
Go to the Resources folder under the project and select the image (it should be listed for you)
Select the image and set the BuildAction to Embedded Resource
I set the File Action to Copy if Newer
From here I move back and forth between Debug and runtime, various combinations of clean, build and publish and the image has FINALLY been displayed every time.
Last tidbit, the XAML in the dialog looks like this:
<Image Source="pack://siteoforigin:,,,/Resources/DeathSpiral.png" />
I have updated several projects that were supposed to display graphics but didn't always do so using the steps above. They all work now. Tested in both VS2017 and VS2019 and no errors so far.

Visual Studio refactor-rename causes inexplicable global replace of attributes in XAML file

I feel like I must be going crazy, but I just changed the name of a property in a view model (a C# file) from Width to Size using Visual Studio's refactor-rename feature. When I was done, this error appeared in the Error window:
Error 2: The property 'Size' does not exist in XML namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'.
The error was referring to a XAML UserControl file. When I checked the file to see what was up, I realized that every attribute named Width had been changed to Size.
Example:
<UserControl x:Class="ApbSymbolGenerator.Views.Symbol"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
Size="{Binding Size}"
Height="{Binding Size}">
This is the first time I've ever had refactor-rename cause a change to a XAML file (besides the x:class value). (Note: I did not do a global find/replace, I did refactor-rename. I undid everything and performed the rename again, and it did the same thing.)
Strangely, it only affected one of several XAML files in my app that has a Width property.
Any explanation what could be going on here?
Looks like this is a bug (that won't be fixed) - Refactor Rename Bug

Categories