2009-04-30 37 views
5

Tôi có một ứng dụng .NET 2.0 mà chỉ chạy tốt trên XP và Vista, nhưng trên Windows 7 RC (x64) nó bị treo với các lỗi sau:Windows 7 TextureBrush..ctor() lỗi

Exception Thông tin


Loại ngoại lệ: System.OutOfMemoryException Thông báo: Hết bộ nhớ. dữ liệu: System.Collections.ListDictionaryInternal TargetSite: .ctor Void (System.Drawing.Image, System.Drawing.Drawing2D.WrapMode) HELPLINK: NULL Nguồn: System.Drawing

StackTrace Thông tin


tại System.Drawing.TextureBrush..ctor (Hình ảnh, WrapMode wrapMode) tại System.Windows.Forms.ControlPaint.DrawBackgroundImage (Đồ họa g, Hình ảnh backgroundImage, Màu backColor, ImageLayout backgroundImageLayout, Rectangle bounds, Rectangle clipRect, Point scrollOffset , RightToLeft rightToLeft) tại System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Rectangle rectangle, Color backColor, Point scrollOffset) tại System.Windows.Forms.Control.PaintBackground (PaintEventArgs e, Rectangle rectangle) tại System.Windows.Forms. Control.OnPaintBackground (PaintEventArgs pevent) tại System.Windows.Forms.ScrollableControl.OnPaintBackground (PaintEventArgs e) tại System.Windows.Forms.Control.PaintWithErrorHandling (PaintEventArgs e, lớp Int16, Boolean disposeEventArgs) tại System.Windows.Forms .Control.WmPaint (Thư & m) tại System.Windows.Forms.Control.WndProc (Thư & m) tại System.Windows.Forms.ScrollableControl.WndProc (Thư & m)

Bất kỳ ý tưởng nào về lý do tại sao điều này đang xảy ra hoặc cách tôi có thể lập trình xung quanh nó? Nó chỉ vẽ một biểu tượng tiêu chuẩn không có nền đặc biệt.

CẬP NHẬT: Tôi nhận thấy rằng đây chỉ là vấn đề khi BackgroundImageLayout = ImageLayout.Tile, cũng là mặc định. Đặt nó thành Thu phóng hoặc Trung tâm và vấn đề sẽ biến mất. Đó là khá không đạt yêu cầu mặc dù, bởi vì tôi cần nó để ngói.

+0

Tính năng này có hoạt động tốt trên XP và Vista ** 64 bit ** không? –

+0

Có, nó hoạt động tốt trên cả hai phiên bản 32 & 64 bit của XP & Vista. –

+0

Cảm ơn (đó là một phát bắn trong bóng tối, có một số rắc rối tương tự như âm thanh liên quan đến các vấn đề cross-arch gần đây.) Xin lỗi, ra khỏi ý tưởng. –

Trả lời

1

Hóa ra giải pháp này phải làm với chính tệp PNG được sử dụng cho nền. Tôi vừa mở nó bằng Paint.NET và lưu lại nó, sau đó đặt nó trở lại trong dự án và nó đã hoạt động.

Không chắc chắn những gì đã thay đổi, nhưng nó đã giải quyết được sự cố.

+0

điều này giải quyết được vấn đề của tôi .. thnx –

3

Tôi gặp sự cố tương tự. Trong trường hợp của tôi, tôi đã xử lý MemoryStream của tôi, tôi đã tải hình ảnh từ đó.

//The following throws and OutOfMemoryException at the TextureBrush.ctor(): 

    /*someBytes and g declared somewhere up here*/ 
    Bitmap myBmp = null; 
    using(MemoryStream ms = new MemoryStream(someBytes)) 
     myBmp = new Bitmap(ms); 

    if(myBmp != null) //that's right it's not null. 
     using(TextureBrush tb = new TextureBrush(myBmp)) //OutOfMemoryException thrown 
      g.FillRectangle(tb,0,0,50,50); 

//This code does not throw the same error: 

    /*someBytes and g declared somewhere up here*/ 
     MemoryStream ms = new MemoryStream(someBytes); 
     Bitmap myBmp = new Bitmap(ms); 

     if(myBmp != null) 
      using(TextureBrush tb = new TextureBrush(myBmp)) 
       g.FillRectangle(tb,0,0,50,50); 
+0

Đó chính xác là vấn đề của tôi. Có ai hiểu được .net "dưới mui xe" bận tâm để giải thích hành vi này? – Dinei

1

Vui lòng không thải bỏ Hình ảnh hoặc đóng đối tượng phim từ nơi bạn đã có hình ảnh trước khi gọi lớp TextureBrush để ốp lát. Nếu không, lớp TextureBrush sẽ ném ra một ngoại lệ Out of Memory.

Vì vậy, cách tốt hơn là hiển thị Hình ảnh lát bằng cách gọi Hình ảnh TextureBrush và sau đó đóng đối tượng dòng phim trong sự kiện Paint của biểu mẫu cửa sổ.