Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1067
  • Last Modified:

WPF Button Image

I wish to load images to button controls in a WPF application at run time. Based on application scenario, I wish to know how to change the button image.

I know the static way of loading images, but I need inputs on how to load it dynamically.
0
narayanan_mahalingam
Asked:
narayanan_mahalingam
  • 3
  • 3
  • 2
1 Solution
 
Fernando SotoCommented:
Hi narayanan_mahalingam;

You can do that as shown in the code snippet below.

Fernando
// Create the image element.
Image simpleImage = new Image();

// Create source.
BitmapImage bi = new BitmapImage();
// BitmapImage.UriSource must be in a BeginInit/EndInit block.
bi.BeginInit();
// The first parameter of Uri is the location of the image on disk
bi.UriSource = new Uri(@"D:\Temp\Photo.jpg", UriKind.RelativeOrAbsolute);
bi.EndInit();
// Set the image source.
simpleImage.Source = bi;

// Assuming that the button name is button1 
button1.Content = simpleImage;

Open in new window

0
 
k_swapnilCommented:
Hi Narayan,

Please have a look at the code below...
I have used binding and INotifyPropertyChanged Interface for the solution.

For the sample purposes I have used the code behind as the DataContext for the xaml file but you can replace it as per your needs.

Thx!
Swaps....
///WINDOW2.XAML

<Window x:Class="WpfApplication1.Window2"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window2" Height="300" Width="300">
    <StackPanel>
      <Button Width="150" Height="50" Margin="10">
            <Image Source="{Binding ScenarioImage}"/>
      </Button>
        <ComboBox Margin="20" Height="27" Width="209" SelectionChanged="ComboBox_SelectionChanged">
            <ComboBoxItem>Scenario 1</ComboBoxItem>
            <ComboBoxItem>Scenario 2</ComboBoxItem>
            <ComboBoxItem>Scenario 3</ComboBoxItem>
        </ComboBox>
    </StackPanel>
</Window>

=======================================================

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using System.ComponentModel;

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for Window2.xaml
    /// </summary>
    public partial class Window2 : Window, INotifyPropertyChanged
    {
        private BitmapImage _scenarioImage;
        public BitmapImage ScenarioImage
        {
            get
            {
                return _scenarioImage;
            }
            set
            {
                _scenarioImage = value;
                OnPropertyChanged("ScenarioImage");
            }
        }

        public Window2()
        {
            InitializeComponent();
            ScenarioImage = new BitmapImage(new Uri(@"..\Resources\folder.png", UriKind.Relative));
            this.DataContext = this;
        }

        private void ComboBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            ComboBox cmb = sender as ComboBox;
            if (cmb.SelectedIndex == 0) // senario - 1
            {
                ScenarioImage = new BitmapImage(new Uri(@"..\Resources\folder.png", UriKind.Relative));
            }
            if (cmb.SelectedIndex == 1) // senario - 2
            {
                ScenarioImage = new BitmapImage(new Uri(@"..\Resources\wmpnss_bw48.png", UriKind.Relative));
            }
            if (cmb.SelectedIndex == 2) // senario - 3
            {
                ScenarioImage = new BitmapImage(new Uri(@"..\Resources\wmpnss_color48.png", UriKind.Relative));
            }
        }

        #region INotifyPropertyChanged Members

        /// <summary>
        /// Property Changed Event Handler
        /// </summary>
        public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Property Changed Event Handler
        /// </summary>
        /// <param name="name">name of property</param>
        protected void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

        #endregion
    }
}

Open in new window

0
 
narayanan_mahalingamAuthor Commented:
Swapnil
I am not able to get your code working wi th the relative Uri. Only when I hardcode the complete path for the BitmapImage constructor does the image load.
I have added the folder with the images into the project. What else am I  missing in making in the relative Uri work?
narayanan
0
 [eBook] Windows Nano Server

Download this FREE eBook and learn all you need to get started with Windows Nano Server, including deployment options, remote management
and troubleshooting tips and tricks

 
k_swapnilCommented:
its the relative path from the exe...

For eg my exe is in SampleProject\Debug folder and images are SampleProject\Resources folder, so the relative path is ..\Resources\xyz.png.

"..\" is used to come out of the folder.

Hope this helps...if not please let me know your folder structure (full paths of the directories) i.e where exe is present and where images are present

Thx!
Swaps...
0
 
narayanan_mahalingamAuthor Commented:
Swaps
My exe is in the following location
MyProject\bin\Debug\*.exe

I have put the images in the following folder and added into the project.

MyProject\Images\*.png

I gave the relative Uri as new Uri(@"../../Images/folder.png", UriKind.Relative). This does not work.

Hope my uri path is right..
0
 
k_swapnilCommented:
Have you added the images into project resources?

Thx!
Swaps...
1.JPG
0
 
Fernando SotoCommented:
Hi Swaps;

So you don't like the very first solution?

Fernando
0
 
narayanan_mahalingamAuthor Commented:
Swapnil

I added the resources thru the Project Properties as per your suggestion. Still, the images do not show up in the button.
I am using VC# 2010 Express.
Is there anything I can look for in the debug window to check for the path correctness?
Narayanan
0

Featured Post

Vote for the Most Valuable Expert

It’s time to recognize experts that go above and beyond with helpful solutions and engagement on site. Choose from the top experts in the Hall of Fame or on the right rail of your favorite topic page. Look for the blue “Nominate” button on their profile to vote.

  • 3
  • 3
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now