How to display a PictureBox from behind code in C#
Asked Answered
H

1

4

I know my question sounds basic, but i searched all over the place and found nothing.. this is my code :

public MainWindow()
{
    InitializeComponent();

    Map newMap = new Map();
    newMap.setMapStrategy(new SmallMapStrategy());
    newMap.createMap();


    System.Windows.Forms.PictureBox pictureBox1 = new System.Windows.Forms.PictureBox();
    pictureBox1.Paint += new System.Windows.Forms.PaintEventHandler(newMap.grid[3].afficher);

}

this is the afficher function :

public override void afficher(object sender, PaintEventArgs e)
{
    e.Graphics.DrawImage(squareImage, pos_x, pos_y, 50, 50);
}

squareImage is an attribute corresponding to a Drawing.Image. pos_x and pos_y are custom int32 attributes.

What i'd like is to SEE the image while running my application...

Hollingsworth answered 3/1, 2013 at 16:28 Comment(7)
What type is newMap.grid ?Seneca
also is this winforms or wpf, you have it tagged Wpf but are using a Winforms control and are using the Winforms System.Drawing MethodsSeneca
newMap.grid is a custom class, it's not really relevant here. But it contains the "afficher" method as shown aboveHollingsworth
That may be, but my second question is relevant.Seneca
oh sorry, didn't see it. The project is WPF focused but i'm meant to use DrawImage that actually uses pictureBoxes and winforms (i guess?)Hollingsworth
The type of newMap.grid is defined in another project that is not using WPF. It's a .lib C# project. That means i cannot use Controls into afficher's definition.Hollingsworth
is afficher being called? or is the problem that it is being called but you don't see anything in the picture box? do you even see the picture box on the form? Are you missing this.controls.add(pictureBox1), or is that just not in the code you are showing?Kimsey
S
12

Since the PictureBox that you are using is a Winforms Control you will need to add a WindowsFormsHost Control to your Wpf Form and add the PictureBox to that. Any time you dynamically create a control you need to add it to the Form or Container object otherwise it will not be shown.

But first, add these references:

System.Windows.Forms
WindowsFormsIntegration

Now write code something like this.

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <WindowsFormsHost Height="175" HorizontalAlignment="Left" Margin="10,10,0,0" Name="windowsFormsHost1" VerticalAlignment="Top" Width="255" />
    </Grid>
</Window>

MainWindow.xaml.cs

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            System.Windows.Forms.PictureBox picturebox1 = new System.Windows.Forms.PictureBox();
            windowsFormsHost1.Child = picturebox1;
            picturebox1.Paint += new System.Windows.Forms.PaintEventHandler(picturebox1_Paint);
        }

        void picturebox1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
        {
            System.Drawing.Bitmap bmp = new System.Drawing.Bitmap(@"C:\Temp\test.jpg");
            System.Drawing.Point ulPoint = new System.Drawing.Point(0, 0);
            e.Graphics.DrawImage(bmp,ulPoint);
        }
    }
}
Seneca answered 3/1, 2013 at 17:3 Comment(3)
hm it says it can't find the WindowsFormsHost type. I'm doing research to find what's missing.Hollingsworth
@AdrienBrunelat it should be a control in your Wpf ToolBox that you add to the Wpf Form.Seneca
Yes indeed, and it added automatically the reference i was mising. Thanks !Hollingsworth

© 2022 - 2024 — McMap. All rights reserved.