Add an image in a WPF button

257,868

Solution 1

In the case of a 'missing' image there are several things to consider:

  1. When XAML can't locate a resource it might ignore it (when it won't throw a XamlParseException)

  2. The resource must be properly added and defined:

    • Make sure it exists in your project where expected.

    • Make sure it is built with your project as a resource.

      (Right click → Properties → BuildAction='Resource')

Snippet

Another thing to try in similar cases, which is also useful for reusing of the image (or any other resource):

Define your image as a resource in your XAML:

<UserControl.Resources>
     <Image x:Key="MyImage" Source.../>
</UserControl.Resources>

And later use it in your desired control(s):

<Button Content="{StaticResource MyImage}" />

Solution 2

Please try the below XAML snippet:

<Button Width="300" Height="50">
  <StackPanel Orientation="Horizontal">
    <Image Source="Pictures/img.jpg" Width="20" Height="20"/>
    <TextBlock Text="Blablabla" VerticalAlignment="Center" />
  </StackPanel>
</Button>

In XAML elements are in a tree structure. So you have to add the child control to its parent control. The below code snippet also works fine. Give a name for your XAML root grid as 'MainGrid'.

Image img = new Image();
img.Source = new BitmapImage(new Uri(@"foo.png"));

StackPanel stackPnl = new StackPanel();
stackPnl.Orientation = Orientation.Horizontal;
stackPnl.Margin = new Thickness(10);
stackPnl.Children.Add(img);

Button btn = new Button();
btn.Content = stackPnl;
MainGrid.Children.Add(btn);

Solution 3

Use:

<Button Height="100" Width="100">
  <StackPanel>
    <Image Source="img.jpg" />
    <TextBlock Text="Blabla" />
  </StackPanel>
</Button>

It should work. But remember that you must have an image added to the resource on your project!

Solution 4

You can set the button's background to the image if you then want to overlay text.

<Button>
   <Button.Background>
     <ImageBrush ImageSource="/AssemblyName;component/Pictures/img.jpg"/>
   </Button.Background>
   <TextBlock>Blablabla</TextBlock>
</Button>

Watch out for the image source syntax. See this question for help.

Solution 5

I also had the same issue. I've fixed it by using the following code.

        <Button Width="30" Margin="0,5" HorizontalAlignment="Stretch"  Click="OnSearch" >
            <DockPanel>
                <Image Source="../Resources/Back.jpg"/>
            </DockPanel>
        </Button>

Note: Make sure the build action of the image in the property window, should be Resource.

enter image description here

Share:
257,868
Marco
Author by

Marco

Updated on June 11, 2020

Comments

  • Marco
    Marco about 4 years

    I tried this solution:

    <Button>
        <StackPanel>
            <Image Source="Pictures/img.jpg" />
            <TextBlock>Blablabla</TextBlock>
        </StackPanel>
    </Button>
    

    But I can see the image only in the project window, and when I launch the program it disappears.

    If I try this:

      Image img = new Image();
      img.Source = new BitmapImage(new Uri("foo.png"));
    
      StackPanel stackPnl = new StackPanel();
      stackPnl.Orientation = Orientation.Horizontal;
      stackPnl.Margin = new Thickness(10);
      stackPnl.Children.Add(img);
    
      Button btn = new Button();
      btn.Content = stackPnl;
    

    I get a "'System.Windows.Markup.XamlParseException' in PresentationFramework.dll" exception.

    What is the solution?

  • Venugopal M
    Venugopal M over 9 years
    I think you will have to put double quotes like <Button Content="{StaticResource MyImage}" /> rather than content={...}.
  • yu yang Jian
    yu yang Jian over 7 years
    the source path can try <Image x:Key="kkk" Source="../Folder1/Img.png"/>
  • user2386301
    user2386301 over 5 years
    what should I fill for sometemplate ?
  • yu yang Jian
    yu yang Jian over 5 years
    if you're not using Template, you can remove Template="{StaticResource SomeTemplate}", if you want to know what template is, you can try to google wpf template
  • Sracanis
    Sracanis almost 5 years
    I tried your second method but stuck with the this error. "The attachable property 'Resources' was not found in type 'UserControl'."