I need to change the background image at runtime, based on which RadioButton the user clicks. I'm doing this in a WPF project in Visual Studio, and I need to put the code in the Checked event in the xaml.cs file
I have an Image control called imgBackground, with 6 images in its Source collection, which are listed in an Images folder in the Solution Explorer.
I've tried:
this.imgBackground.Source = "filename.jpg";
both with and without the quotes, and with various paths (I've tried too many different variations to list them all here) and nothing works - everything I've tried just gives an error in the editor, before I even try to build and run anything (the error given varies depending on what I'm trying at the time).
If you are using relative paths as filenames like
this.imgBackground.Source = "filename.jpg";
then these files must be in the same directory as the .exe of your program is.
One workaround would be to use absolute paths like
this.imgBackground.Source = #"C:\MyFolder\MyProject\filename.jpg";
Or, even further use the packaging mechanism of WPF or pack your images as resources into your assembly. Look at this thread.
EDIT:
For your clarification:
The Source-property demands an System.Windows.Media.ImageSource-object, which you must provide.
Do it like this:
BitmapImage bi3 = new BitmapImage();
bi3.BeginInit();
bi3.UriSource = new Uri("filename.jpg", UriKind.Relative);
bi3.EndInit();
this.imgBackground.Source = bi3;
Please refer to this documentation here.
Related
This question already has answers here:
Image in WPF Button not Visible at Runtime
(11 answers)
How to load image to WPF in runtime?
(2 answers)
Closed 3 years ago.
I am trying to dynamically insert a WPF Image into a grid. I currently have some code that already does this, it iterates through a list of URLs and then takes the picture from that URL and creates an image and then inserts it into the grid at a specified location.
However, I coded this a few months ago and I have since forgotten how to do it properly. Looking back at my code, I have copied the relevant snippets into a new test method for debugging purpose. The "lite" version of the code clears all the Children and RowDefinitions of the grid, and then creates a new RowDefinition and an Image. It then inserts the image into the row.
RowDefinition def = new RowDefinition
{
Height = new GridLength(400)
};
myGrid.RowDefinitions.Add(def);
Image img = new Image
{
Source = new BitmapImage(new Uri(#"folderpath/myimage.png", UriKind.Relative)),
Margin = new Thickness(0, 5, 0, 5)
};
Grid.SetRow(img, 0);
Grid.SetColumn(img, 0);
myGrid.Children.Add(img);
But when this code is run it produces nothing. Nothing appears inside the grid.
It should be noted that inside my Visual Studio project I have a folder "folderpath" with a bunch of images that are copied upon building the project. If I add myimage.png to the project inside of VS, and run the code snippet above everything works. The image is created and placed inside the grid.
But if I do not add myimage.png to the VS project before building, and instead copy the file over to the correct directory using Windows Explorer and then run the code, it does not work. This makes me believe it may be a directory issue, but when testing Environment.CurrentDirectory it is as expected.
I am now at a loss, why does the image only appear when I've added it inside my VS project before building and not when I manually add it to the folder after the build has completed?
Thanks for your help
I have had a similar issue before with an image showing in the XML editor but not showing when the code is ran. It's actually the intended behavior.
This is because in the editor it will get the link even if it isn't included in the project. However, when you build your code it won't show anything that isn't included in the project. Best practice is to have an img or resource folder in your project where you put all your relevant resources in.
I am working with a Windows Forms application in Visual Studio 2010. I have a resources file, Flags.resx. I have uploaded images to the resource file, and want to show them in an Image control (picFlag). What is funny is THIS is super-easy, because my image files are strongly typed:
picFlag.Image = Flags.AE_Flag
But what I want to do, of course, is not. I want to dynamically provide the name of the image like this pseudo-code:
string strFlag = "AE_Flag";
picFlag.Image = Flags[strFlag]
Any suggestions on the simplest way to do this?
you can use the following
var rm = new System.Resources.ResourceManager("YourProject.Properties.Resources",
typeof(Resources).Assembly);
var image = rm.GetObject("AE_Flag") as System.Drawing.Image;
hope it will help you
i have a project with a lot of assemblies (> 100). many of those assemblies have subfolders like "images". many wpf-windows/user-controls for example have a "\images\close.png". that means that i have many "close.png" pictures instead of just a single one.
now i want to create a central place for all images/resources. what i did:
created a new class-libary/assembly called "a.b.c.d.e.Core.Resources"
added a resourcedictionary called "ImageDictionary.xaml"
created a subfolder "Images"
copied my images to this subfolder. for example "a.b.c.d.e.Core.Resources\images\close.png"
setting the built property of the image to "resource"
declared the image in the "ImageDictionary.xaml" like this "< ImageSource x:Key="Image_close">close.png< /ImageSource>"
using the dictionary in the wpf window where i want to use the "close.png" image like this
< Window.Resources>
< ResourceDictionary Source="pack://application:,,,/a.b.c.d.e.Core.Resources;component/Images/ImageDictionary.xaml"/>
< /Window.Resources >
trying to use the image declared in the central resource dictionary "ImageDictionary.xaml" like this < Button>< Image Source="{StaticResource Image_close}">< /Image>< /Button>
in the designer mode of VS the image is beeing displayed but when i start the project and open my wpf window i get an error like
"{"The File or Assembly \"a.b.c.d.e.Core.Resources, Culture=neutral\" or one of its dependencys can't be found. The system can't find the given file.":"a.b.c.d.c.e.Resources, Culture=neutral"} (i translated the error message from german to english :) )
Does anyone have any idea what i did wrong and why i can't get the central resourcedictionary getting to work properly? Thanks for any ideas!!!
Greetings from Germany
edit:
i also have a reference to "a.b.c.d.e.Core.Resources" in the assembly where my wpf window is
edit 2:
System.Windows.Markup.XamlParseException: Message=RowNumber "7" and RowPosition "10" of "Setting the Property "System.Windows.ResourceDictionary.Source" caused an exception".
Ok, the first idea I have is, that the file cannot be found because of the maximum path length limitation of the WinApi. I'm not sure about it, because I don't know anything about the internals of the resource loading mechanism.
Please try to start the program from a shorter path. Perhaps, it'll solve the problem.
EDIT
Just an idea, is your ImageDictionary.xaml declared as resource? If not, you should set its build step to "resource".
EDIT2
Next idea. Please empty the ImageDictionary.xaml by commenting out the elements. Uncomment the dictionary element by element. Perhaps, you'll find the reason for your problem, this way.
I'm trying to use an icon that I've added as a resource as the image on a button. I know it's possible because I can do it in other projects through the designer. However, I'm trying to do this with code. I added the icon as a resource to my project by following the steps in the accepted answer to this question. The resource is named CancelButtonIcon.
Now, I'm trying to add that icon as the image on a standard button with this code:
this.CancelButton.Image = (System.Drawing.Image)Properties.Resources.CancelButtonIcon;
However, I get an error message:
Cannot convert type 'System.Drawing.Icon' to 'System.Drawing.Image'
In the code that Visual Studio automatically generates when I use the designer, it looks like this:
((System.Drawing.Image)(resources.GetObject("SaveButton.Image")));
which results from manually adding a resource through the Properties window. How can I convert this icon resource to an image so it can be used on the button? Adding it through the designer is not an option (this button is created programmatically and thus isn't present in the designer).
You can use the Icon.ToBitmap method for this purpose. Note that a Bitmap is an Image.
CancelButton.Image = Properties.Resources.CancelButtonIcon.ToBitmap();
Not sure why, but any time I tried using the accepted answer's approach, the .ToBitmap() call was giving me array index out of bounds exceptions. I solved this by doing it this way instead:
System.Drawing.Icon.FromHandle(Properties.Resources.CancelButtonIcon.Handle).ToBitmap();
I am not familiar with WPF, and I just feel quite confusing.
I am trying to create a little computer game, and there are elements I want to display dynamically. I use Image class and add the images to a canvas. But I'm not sure whether it's a good practice. I feel that adding controls to canvas seem to be a little wired. And I'm a little concerned about the performance, because I may need many images.
The real problem is, I can't load the images from the image files. I see an example in a text book like this (XMAL):
<Image Panel.ZIndex="0" Margin="0,0,0,0" Name ="image1">
<Image.Source>
<BitmapImage UriSource="Bell.gif" />
</Image.Source>
</Image>
Where Bell.gif is added into the project.
And I tried to copy this in code to create an image.
new Image { Source = new BitmapImage(new Uri("Blockade.bmp"))}
But I got invalid Uri exception. After some search in the Internet, I found that loading resources dynamically seems to be difficult. Can I load the files added to the project dynamically?
If I use absolute path then it's OK. But I can't expect every computer will put the files in the same location. Can I use relative path?
I tried
new Image { Source = new BitmapImage(new Uri(#"Pictures\Blank Land.bmp", UriKind.Relative)) }
But it doesn't work. (The image is blank)
Thanks.
I deleted the code. I just found the solution in "Pack URIs in WPF" in MSDN.
I can either use "pack://application:,,,/Blockade.bmp" (absolute) or "/Blockade.bmp" (Relative) for a resource in the local assembly.
(I didn't use '/' at first)
"pack://application:,,,/ReferencedAssembly;component/File.xaml" is for referenced assembly. (I guess the problem with the answer is that the authority part is missing)
The following works:
new BitmapImage(new Uri("/MyProject;component/Resources/next.png", UriKind.Relative));
Just replace "MyProject" with the name of your project, and adjust the path to your image.
Make sure the image is added to the project with the "BuildAction" set to "Resource".