Wenn ich eine Bitmap an ein Property eines UserControl übergeben will kommt es zum Fehler

Klaus Ruttkowski 0 Zuverlässigkeitspunkte
2024-09-17T12:18:42.6933333+00:00

Wenn ich in einer Anwendung eine Bitmap an mein eingebundenes UserControl übergeben möchte kommt es seit ich das UserControl unter NET 8.0 erstelle, zu folgendem Fehler

Fehlermeldung Unter NET 4.0 funktionierte das Programm noch.

Warum? Danke für die Hilfe, Gruß Klaus

Hier einige Code-Ausschnitte

[CategoryAttribute("RuSplash Settings")]
[DescriptionAttribute("Company image")]
[Browsable(true)]
public Bitmap CompanyBitmap { set; get; } = (Bitmap)((new ImageConverter()).ConvertFrom(global::RuSplash.CompanyBitmap.KR_200x200));
// 
// pictureBoxCompany
// 
pictureBoxCompany.Dock = DockStyle.Fill;
pictureBoxCompany.Location = new Point(0, 0);
pictureBoxCompany.MaximumSize = new Size(300, 300);
pictureBoxCompany.Name = "pictureBoxCompany";
pictureBoxCompany.Size = new Size(105, 105);
pictureBoxCompany.SizeMode = PictureBoxSizeMode.StretchImage;
pictureBoxCompany.TabIndex = 0;
pictureBoxCompany.TabStop = false;
pictureBoxCompany.Image = CompanyBitmap;
Windows
Windows
Eine Familie von Microsoft-Betriebssystemen, die auf PCs, Tablets, Laptops, Smartphones, Internet-of-Things-Geräten, eigenständigen Mixed Reality-Headsets, großen Bildschirmen für die Zusammenarbeit und anderen Geräten ausgeführt werden
69 Fragen
.NET
.NET
Microsoft-Technologien, die auf dem .NET-Softwareframework basieren.
27 Fragen
Visual Studio
Visual Studio
Eine Familie von Microsoft-Sammlungen integrierter Entwicklungstools zum Erstellen von Anwendungen für Windows, das Web und mobile Geräte.
35 Fragen
{count} Stimmen

3 Antworten

Sortieren nach: Am hilfreichsten
  1. Dimitar Denkov 1,660 Zuverlässigkeitspunkte Microsoft-Anbieter
    2024-09-18T09:42:45.73+00:00

    Hallo Klaus,

    public Bitmap CompanyBitmap { set; get; } = (Bitmap)((new ImageConverter()).ConvertFrom(global::RuSplash.CompanyBitmap.KR_200x200));
    

    Würdest Du versuchen, diese Konvertierungen nicht in einer Operation durchzuführen, sondern sie in zwei oder drei zu unterteilen, damit der genaue Auslöser des Fehlers eingegrenzt werden kann? Z. B.:

    var Bild = (
    public Bitmap CompanyBitmap { set; get; } = (Bitmap)Bild;
    

    In diesem Thread (im ersten Kommentar unter der zweiten Antwort) wird jedoch empfohlen, anstatt einer direkten Umwandlung in eine Bitmap den Bitmap-Konstruktor zu gebrauchen, der einen Parameter vom Typ Image erhalten kann:

    Cannot implicitly convert type 'System.Drawing.Image' to 'System.Drawing.Bitmap'

    Mit diesem Gedankenanstoß kann man dem Konstruktor das Ergebnis der ersten Konvertierung in ein Image übergeben, vorzugsweise mit dem as-Operator, damit man einen mutmaßlichen null-Wert als misslungene Konvertierung deuten kann, aber hoffentlich reichen diese Codezeilen zur Vermeidung des Fehlers aus:

    var Bild = (new ImageConverter()).ConvertFrom(global::RuSplash.CompanyBitmap.KR_200x200);
    public Bitmap CompanyBitmap { set; get; } = new Bitmap(Bild as Image);
    

    oder so:

    var obj = (new ImageConverter()).ConvertFrom(global::RuSplash.CompanyBitmap.KR_200x200);
    Image Bild = obj as Image;                   //überprüfen, ob Bild null ist!
    public Bitmap CompanyBitmap { set; get; } = new Bitmap(Bild);
    
    

    Wenn der Fehler erneut auftritt, in welcher Zeile passiert das?

    Gruß,

    Dimitar


  2. Klaus Ruttkowski 0 Zuverlässigkeitspunkte
    2024-09-19T07:34:33.0333333+00:00

    Hallo Dimitar,

    danke für die schnelle Antwort, aber ich habe den Fehler wohl nicht eindeutig genug dargestellt.
    die Initialisierung von CompanyBitmap als Default funktioniert ja einwandfrei.
    Der Fehler tritt ein wenn der Programmierer das Control benutzt und die Bitmap über die Eigenschaft
    CompanyBitmap ändern will. Ich hatte auch ein Video erstellt aus dem das hervorging. Das sehe ich allerdings nicht, hat da was nicht funktioniert?

    Nein das scheint mir ein Fehler von Net8.0 zu sein, unter Net4.0 funktionierte es ja.

    Gruß Klaus


  3. Klaus Ruttkowski 0 Zuverlässigkeitspunkte
    2024-09-20T12:02:39.74+00:00

    Ich habe inzwischen die Lösung, man muß das NuGet-Paket:

    NuGet Install-Package System.Drawing.Common -Version 8.0.8

    einbinden und von dort das Image verwenden.

           // using SystemDrawingSection (Nuget.org)
           /*
               // 
               // pictureBoxCompanyImage
               // 
               pictureBoxCompanyImage.Image = UserControlRuSplash.Resource1.Klaus72x72;
               pictureBoxCompanyImage.Location = new Point(112, 55);
               pictureBoxCompanyImage.Name = "pictureBoxCompanyImage";
               pictureBoxCompanyImage.Size = new Size(184, 148);
               pictureBoxCompanyImage.SizeMode = PictureBoxSizeMode.StretchImage;
               pictureBoxCompanyImage.TabIndex = 0;
               pictureBoxCompanyImage.TabStop = false;
          */
           [CategoryAttribute("RuSplash Settings")]
           [DescriptionAttribute("Company CompanyImage")]
           [Browsable(true)]
           public System.Drawing.Image CompanyImage { set; get; }
           private void RuSplash_ClientSizeChanged(object sender, EventArgs e)
           {
               if (CompanyImage != null)
               {
                   this.pictureBoxCompanyImage.Image = CompanyImage;
               }
           }
    
    
    0 Kommentare Keine Kommentare

Ihre Antwort

Fragesteller*innen können Antworten als akzeptierte Antworten markiert werden, wodurch Benutzer*innen wissen, dass diese Antwort das Problem gelöst hat.