larry118 Ответов: 1

Мне нужно передать растровое изображение или изображение в пользовательский элемент управления, а затем передать его обратно в приложение winform


У меня есть приложение, написанное на vb .net, которое вызывает usercontrol, который я написал на C#. Здесь нет никаких проблем. Мне нужно отправить usercontrol изображение, растровое изображение или поток памяти. Я перепробовал их все.

Я также хотел бы иметь возможность отлаживать usercontrol во время запуска приложения winform. Я делал это все время и забыл, как это делается. Я искал в интернете, и я получаю много колкостей. Я помню, что это было довольно прямолинейно, но забыл, как это делается.

Где # % % $ $ $ - это ссылка для загрузки примера?

Что я уже пробовал:

Прилагается небольшое тестовое приложение и пользовательский элемент управления.

В файла testapp запрашивает изображение с помощью стандартного диалогового окна, а затем вызывает элемент управления UserControl, струны проходят штрафом в размере от пользователя контроль приложений WinForm, но я не могу шов, чтобы передать изображение из winform один раз загруженной в PictureBox на winform, чтобы элемент управления PictureBox в пользовательских элементов управления. Мой настоящий usercontrol-это черный ящик. Мне не нужно видеть изображения, просто передать их, обработать и отправить обратно.


Вот основной код из пользовательского элемента управления:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

using System.IO;
namespace MyUserControl
{
    public partial class UserControl1: UserControl
    {
        private MemoryStream mImageIn;
        private string mStrOut;
        public MemoryStream PicIn
        {
            get
            {
                return mImageIn;
            }
            set
            {
                mImageIn = value;
            }
        }
        public string strPicOut
        {
            get
            {
                return mStrOut;
            }
            set
            {
                mStrOut = value;
            }
        }
        public UserControl1()
        {
            InitializeComponent();
        }

        private void UserControl1_Load(object sender, EventArgs e)
        {

        }
        public new void Update()
        {
            // public static System.Drawing.Image FromStream(System.IO.Stream stream);
            Image img = Image.FromStream(PicIn);


            pictureBox1.Image = img;
            MessageBox.Show("Hello There");
            strPicOut = "Whats Not Up";
        }

       
    }
}


Вот код из приложения Windows form:

Imports MyUserControl
Imports System.Drawing.Imaging
Imports System.IO

Public Class Form1
    Private UI1 As New UserControl1

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim strfilename As String
        OpenFileDialog1.Filter = "All Images Files (*.png;*.jpeg;*.gif;*.jpg;*.bmp;*.tiff;*.tif _
         | *.png;*.jpeg;*.gif;*.jpg;*.bmp;*.tiff;" & "*.tif"
        Dim OKDK As Boolean = OpenFileDialog1.ShowDialog
        If OKDK Then
            strfilename = OpenFileDialog1.FileName
            PictureBox1.Image = Image.FromFile(strfilename)
            Dim bmp As Bitmap = PictureBox1.Image

            Dim Picstream As MemoryStream = New MemoryStream
            bmp.Save(Picstream, ImageFormat.Bmp)
            UI1.PicIn = Picstream

            UI1.Update()
            Label2.Text = UI1.strPicOut
        End If
        Cursor = Cursors.Default
    End Sub

    Private Sub UserControl11_Load(sender As Object, e As EventArgs) Handles ImgTest.Load

    End Sub
End Class




Любая помощь будет очень признательна. Это приложение должно быть в пятницу, и я боролся со всеми видами глупостей 24 часа в сутки в течение последних нескольких недель. Полностью в стрессе.

Ларри

1 Ответов

Рейтинг:
9

OriginalGriff

Просто обратитесь к проекту UserControl вместо DLL в вашем приложении WinForm, и когда вы отладите свое основное приложение, вы также сможете отлаживать его прямо в свой элемент управления.


[редактировать]
Хорошо - я создал тестовое решение.
Добавил проект ClassLibrary, удалил класс по умолчанию Class1, добавил UserControl под названием DemoUserControl, опустил на него PictureBox, установил его в Dock/Fill. Добавлено свойство изображения в элемент управления:

namespace DemoClassLibrary
    {
    public partial class DemoUserControl : UserControl
        {
        public Image Image
            {
            get
                {
                return MyPictureBox.Image;
                }
            set
                {
                MyPictureBox.Image = value;
                }
            }
        public DemoUserControl()
            {
            InitializeComponent();
            }
        }
    }

Добавил проект WinForms в решение под названием DemoForm, установил его в качестве стартового проекта. Добавлена ссылка на DemoClassLibrary.
Построил решение.
Сбросил DemoUserControl на форму в конструкторе.
Добавлена кнопка, обработано событие щелчка:
private void MyButton_Click(object sender, EventArgs e)
    {
    OpenFileDialog ofd = new OpenFileDialog();
    if (ofd.ShowDialog() == DialogResult.OK)
        {
        Image image = Bitmap.FromFile(ofd.FileName);
        MyDemoUserControl.Image = image;
        }
    }

Добавлена вторая кнопка, обработано это событие щелчка:
private void MyGetButton_Click(object sender, EventArgs e)
    {
    Image image = MyDemoUserControl.Image;
    MessageBox.Show($"{image.Height}x{image.Width}");
    }

Запустить его.
Нажмите кнопку один, выберите изображение, оно показывает.
Нажмите кнопку два, она показывает размер.
Повторяю - это работает.
Это не идеально - вы не можете открыть одно и то же изображение дважды, потому что оно заблокировано, поскольку я не удаляю свои растровые изображения, - но это работает. Каждый раз.

Так что же я сделал такого, что отличается от того, что сделали вы?

[/редактировать]


larry118

Немного больше информации, пожалуйста. Я могу добавить проект UserControl в приложение Windows, но не отладки пользовательских элементов управления. Можете ли вы объяснить, что вы подразумеваете под "ссылкой"

Afzaal Ahmad Zeeshan

Возможно, вам придется перестроить проект, чтобы элемент управления был виден.

Смотрите подробнее об этом здесь.

larry118

Я получил отладку для работы и могу видеть переменные которые я передал в метод пользовательского управления Update но в этом методе элементы управления которые я пытаюсь присвоить значениям ничего не делают:

Код Пользовательского Элемента Управления :

использование системы.ИО;

пространство имен MyUserControl
{

общественный разделяемого класса файл usercontrol1 : элемент управления UserControl
{
частная потоке MemoryStream mImageIn;
частная строка mStrOut;
частная строка mStrIn;
public MemoryStream PicIn
{
получить
{
возврат mImageIn;
}
набор
{
mImageIn = значение;
}
}
публичная строка strPicOut
{
получить
{
возвращение mStrOut;
}
набор
{
mStrOut = значение;
}
}
публичная строка strPicIn
{
получить
{
возвращение мстрина;
}
набор
{
mStrIn = значение;
}
}
общественные файл usercontrol1()
{
метод InitializeComponent();
}


обновление общественного недействительными(потоке MemoryStream PicIn ул., строку )
{

Image img = изображение.FromStream(PicIn);


это.имя picturebox1.Изображение = ИМГ;
Ящик для сообщений.Шоу("Привет Там");
this.strPicOut = "что не так";
txtBox1.Текст стр = ;
}


}
}

OriginalGriff

Обычная причина этого заключается в том, что вы не используете отображаемый экземпляр UserControl - проверьте код, вызывающий Update, и посмотрите, какой именно экземпляр вы пытаетесь обновить. Помните: у вас cna есть много копий UserControl в одной форме, поэтому вы должны указать точную копию на дисплее, который вы хотите использовать. Если вы скажете

x = новый MyUserControl;
x.обновление(...);

Он ничего не обновит.

larry118

Счастливого Дня Благодарения. Я ценю твой ответ, но дело не в этом. Вот как я объявляю пользовательский элемент управления:
Импортирует MyUserControl
Система Импорта.Рисование.Изображений
Система Импорта.ИО



Общественного Класса Form1

Public UI1 как новый UserControl1
Общественные Саб Новый()
Теперь, когда у меня есть отладочная работа, я вижу, что данные попадают в метод обновления. Поток преобразуется обратно в растровое изображение, но назначение текста и растрового изображения соответствующим элементам управления не работает.

OriginalGriff

Этот код не добавляет UserControl на дисплей - обычно вы не объявляете его сами, а перетаскиваете его из панели инструментов в свою форму. Если вы сделали и то, и другое, то доступ к элементу управления через UI1 будет работать, но дисплей не изменится, потому что он использует элемент управления, который был отброшен.

Я предполагаю здесь - но так как у меня нет доступа к вашему приложению или экрану, я не могу сказать.

larry118

Окей. Я действительно добавил usercontrol во время разработки. Я буду F#^$d, Если сегодня вечером это не сработает. Передача переменных из windows forms в usercontrols не должна быть такой сложной задачей, и, по-видимому, нет никаких реальных решений, когда вы запрашиваете в интернете что-либо похожее на передачу изображений из windows forms в usercontrols, это не работает.

OriginalGriff

Я добавил информацию к ответу - посмотрите сами.