ข้อผิดพลาดกับ Microsoft WinForms Series 1: อุปกรณ์กราฟิก

ฉันมีปัญหากับตัวอย่างนี้ ฉันเพิ่งดาวน์โหลดและเรียกใช้ (Visual Studio 2010) ฉันไม่ได้แตะอะไรเลย.ป้อนคำอธิบายรูปภาพที่นี่

ขออภัยสำหรับภาษา มันเป็นภาษาอิตาลี จากบนลงล่างเขียนว่า:

  • เพื่อหลีกเลี่ยงการสูญเสียข้อมูลก่อนที่จะโหลดหน้าต่างตัวออกแบบ จำเป็นต้องแก้ไขข้อผิดพลาดเหล่านี้:
  • ไม่สามารถแสดงภาพ Windows ตัวออกแบบสำหรับไฟล์ได้ เนื่องจากไม่สามารถออกแบบคลาสได้ ยูทิลิตี้ตัวออกแบบได้ตรวจสอบคลาสเหล่านี้แล้ว: SpinningTriangleControl --- ไม่สามารถโหลดคลาสพื้นฐานได้ "WinFormsGraphicsDevice.GraphicsDeviceControl" ตรวจสอบว่ามีการอ้างอิงถึงแอสเซมบลีและสร้างโครงการทั้งหมด
  • ข้างล่างก็บอกเหมือนกัน

โปรดทราบว่า:

  • ถ้าฉันคอมไพล์และรัน มันก็ใช้งานได้
  • ในแถบเครื่องมือของ ide บางครั้ง (ฉันไม่รู้ว่าเมื่อใด) มีตัวควบคุมสองตัวที่สร้างขึ้นด้วยตัวอย่าง SpinningTriangleControl และ SpriteFont; บางครั้งพวกเขาก็หายไป เมื่อสิ่งนี้เกิดขึ้น การควบคุมจะถูกลบออกจากแบบฟอร์ม MainWindow ของโปรเจ็กต์ด้วย!
  • ฉันไม่รู้ว่ามันสำคัญหรือไม่ แต่ฉันสังเกตเห็นว่าการควบคุมหายไปบ่อยครั้งและลบตัวเองออกจาก xxx.designer.cs ในขณะที่ฉันเพิ่มการควบคุมใหม่บางอย่าง เช่น toolstripmenu ฯลฯ หรือฉันเพิ่มเหตุการณ์ใหม่ ตัวจัดการสำหรับการควบคุมบางอย่าง

ฉันไม่เข้าใจว่าเกิดอะไรขึ้น

แก้ไขโดย JT: repro อยู่ที่นี่: sdrv.ms/1kIhI5o

ขั้นตอนการทำซ้ำ:

เปิดโซลูชัน
เลือกตัวควบคุม flowLayoutPanel1
เรียกใช้แอปพลิเคชัน
หยุดแอปพลิเคชัน
ตอนนี้ลองเลือก gameWrapper!

ผลลัพธ์:
ไม่สามารถเลือกการควบคุม gameWrapper ได้อีกต่อไป มันไม่ปรากฏในรายการดรอปดาวน์ Property Windows ของการควบคุมแบบฟอร์มด้วยซ้ำ!


person Francesco Bonizzi    schedule 09.12.2013    source แหล่งที่มา
comment
ตัวอย่างนั้นถูกส่งไปเมื่อวันที่ 1/10/2551 บางทีโครงการนั้นต้องการให้ VS2008 ทำงานอย่างถูกต้องใช่ไหม PS: ดีใจที่ได้พบชาวอิตาเลียนคนอื่นๆ ที่นี่   -  person pinckerman    schedule 15.12.2013
comment
ขอบคุณสำหรับคำแนะนำ ฉันคิดว่ามันอาจจะเป็น ป.ล. ฉันก็ดีใจเหมือนกัน :)   -  person Francesco Bonizzi    schedule 15.12.2013
comment
@misiMe แอพตัวอย่างนี้มันบั๊กสุดๆ! ฉันใช้งานไปสองสามครั้ง ไม่ได้เปลี่ยนแปลงอะไรเลย และตอนนี้แผงด้านซ้ายไม่แสดง ฉันได้ทำตามขั้นตอนการทำซ้ำของคุณโดยพยายามหาแผงที่ถูกต้องเพื่อทำให้เกิดปัญหากับนักออกแบบแต่ทำไม่ได้ คุณช่วยกรุณาอัปโหลดวิธีแก้ปัญหาของคุณ (ไปยังเว็บไซต์ temp-share ให้ตัดสิ่งใดก็ตามที่ไม่เกี่ยวข้องออกไป) เพื่อที่ฉัน/เราจะจำลองปัญหาของคุณโดยตรง และดูว่าฉันสามารถวินิจฉัยสาเหตุที่แท้จริงได้หรือไม่   -  person Jeremy Thompson    schedule 25.12.2013
comment
@JeremyThompson ขอบคุณมาก! นี่คือลิงค์: sdrv.ms/1kIhI5o เมื่อฉันซิปไฟล์ด้วยสองโปรเจ็กต์: เปิดโปรเจ็กต์ของ OhmGameProject ที่นี่คุณสามารถสร้างปัญหาขึ้นมาใหม่ได้โดยการเปิดหน้าต่างตัวออกแบบของ MainForm จากนั้นเรียกใช้แอปพลิเคชัน เมื่อคุณออกจากแอปพลิเคชัน (ฉันได้ดำเนินการโดยการกด x บนหน้าต่าง) คุณจะกลับสู่ Windows ของนักออกแบบ ที่นี่ (บางครั้ง) คุณจะสังเกตเห็นว่าคุณไม่สามารถเลือกการควบคุม GameWrapper2 ได้ (นี่คือปัญหา) จากนั้นหากคุณพยายามเพิ่มการควบคุมทุกที่ ให้บันทึก ปิดหน้าต่างตัวออกแบบแล้วเปิดใหม่อีกครั้ง GameWrapper2 จะไม่อยู่ที่นั่น   -  person Francesco Bonizzi    schedule 26.12.2013


คำตอบ (7)


ฉันได้เห็นสิ่งนี้เกิดขึ้นในบางสถานการณ์

1) โครงการได้รับการอ้างอิงถึงตัวมันเอง

หากคุณมี usercontrol ในโปรเจ็กต์ A และใช้การออกแบบเพื่อเพิ่ม usercontrol ให้กับฟอร์มในโปรเจ็กต์ A ด้วย Visual Studio จะเพิ่มการอ้างอิงตนเองซึ่งจะทำให้นักออกแบบเสียหาย

2) การสร้างคลาสฐานนามธรรมสำหรับองค์ประกอบภาพ

เนื่องจากคลาสนามธรรมไม่สามารถสร้างอินสแตนซ์ได้ ผู้ออกแบบจึงไม่สามารถสร้างอินสแตนซ์เพื่อแสดงผลในตัวออกแบบได้

3) ข้อบกพร่องของโหมดการออกแบบ

หากคุณใช้คุณสมบัติ DesignMode เพื่อพิจารณาว่า UserControls ควรโหลดข้อมูลในเหตุการณ์เช่น Load() หรือไม่ คุณจำเป็นต้องทราบว่า DesignMode จะใช้งานไม่ได้หากคุณซ้อนการควบคุมไว้ลึกมากกว่าหนึ่งระดับ คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยสร้างตัวแปร designmode ของคุณเองโดยปิด LicenseManager.UsageMode

person Scope Creep    schedule 23.12.2013
comment
ใช่ ชั้นเรียนนี้เป็นนามธรรม ฉันจะแก้ปัญหานี้ได้อย่างไร นอกจากนี้บางครั้งมันก็ถูกดึงออกมาเป็นตัวควบคุม แต่บางครั้งก็ไม่เป็นเช่นนั้น - person Francesco Bonizzi; 24.12.2013
comment
คลาสพื้นฐานของคุณจะต้องเป็นคลาสที่เป็นรูปธรรมแทนที่จะเป็นคลาสนามธรรม ในการทำเช่นนี้ คุณจะต้องเปลี่ยนวิธีนามธรรมทั้งหมดของคุณไปเป็นวิธีเสมือน คีย์เวิร์ดเสมือนจะอนุญาตให้คุณหรือนักพัฒนารายอื่นแทนที่การใช้งานฐานได้ แต่หากไม่มีการระบุการใช้งานแทนที่ในคลาสย่อย ก็จะใช้ค่าเริ่มต้นเป็นการใช้งานฐาน ฉันรู้ว่าสิ่งนี้อาจสร้างความรำคาญได้ เพราะคุณอาจต้องการบังคับวิธีการบางอย่างให้นำไปใช้ในคลาสย่อย ดังนั้นคีย์เวิร์ด abstract...แต่การใช้วิธีเสมือนจะช่วยให้คุณยังคงได้รับการสนับสนุนจากนักออกแบบ - person Scope Creep; 26.12.2013
comment
ขอบคุณ. หลังจากค้นหามาหลายครั้ง นี่เป็นวิธีแก้ไขปัญหาของฉันที่ถูกต้อง ฉันเพิ่งลบนามธรรมออกจาก GraphicsDeviceControl และสร้างเสมือนทั้งสองวิธี (อัปเดตและวาด) ที่เป็นนามธรรม ขอบคุณ! - person Francesco Bonizzi; 06.01.2014

สิ่งนี้เกิดขึ้นกับฉันเช่นกันเป็นครั้งคราว สิ่งเดียวที่ได้ผลคือการลบตัวควบคุมแบบกำหนดเองออกจากหน้าต่างแล้วเพิ่มอีกครั้ง

person Mariano    schedule 10.12.2013

ฉันได้เพิ่มขั้นตอนการทำซ้ำในคำถามของคุณและประสบปัญหาครึ่งหนึ่ง

ขั้นตอนการทำซ้ำ:
1. โซลูชันที่เปิดอยู่
2. เลือกตัวควบคุม flowLayoutPanel1
3. เรียกใช้แอปพลิเคชัน
4. หยุดแอปพลิเคชัน

จากนั้นฉันไม่สามารถเลือกตัวควบคุม gameWrapper ได้! การควบคุม gameWrapper ไม่แสดงในรายการแบบเลื่อนลงของการควบคุมแบบฟอร์มของหน้าต่างคุณสมบัติด้วยซ้ำ!

ฉันพยายามเพิ่มการควบคุมตามที่คุณกล่าวถึงเพื่อทำให้เกิดปัญหา ฉันยังเพิ่ม SpinningTriangleControl.cs การควบคุมผู้ใช้ที่แสดงในภาพหน้าจอของคุณว่าเป็นปัญหา (แต่ไม่ได้รวมอยู่ในโซลูชันการจำลองที่ ได้รับการอัปโหลด).

หากต้องการจำลองการควบคุมผู้ใช้ SpinningTriangleControl.cs ที่ไม่สามารถเปิดได้ตามภาพหน้าจอของคุณ คุณเพียงแค่ละเว้นการอ้างอิง using OhmGame_Level_editor; Namespace:

ป้อนคำอธิบายรูปภาพที่นี่

ป้อนคำอธิบายรูปภาพที่นี่

การเพิ่ม using OhmGame_Level_editor; ทำให้ฉันสามารถเปิดตัวควบคุมผู้ใช้ SpinningTriangleControl.cs ได้โดยไม่มีข้อผิดพลาดของตัวออกแบบ

จะต้องเป็นข้อบกพร่องของ XNA/Visual Studio - อย่างไรเมื่อมีการเลือกการควบคุมนอกเหนือจาก gameWrapper และหลังจากเรียกใช้/หยุดแอปพลิเคชัน ตัวควบคุม gameWrapper จะมองเห็นได้ แต่ไม่สามารถเลือกได้!

วิธีแก้ปัญหา:
ฉันพบว่าเมื่อฉันเปิดโซลูชันและล็อคส่วนควบคุม gameWrapper ฉันจึงสามารถเลือกได้ไม่ว่าจะถูกเลือกหรือไม่ก็ตามเมื่อเรียกใช้/หยุดแอปพลิเคชัน

ป้อนคำอธิบายรูปภาพที่นี่

person Jeremy Thompson    schedule 26.12.2013
comment
หลังจากเวลาผ่านไปนาน น่าเสียดาย แม้ว่าฉันจะล็อคการควบคุมไว้ แต่ gameWrapper ก็หายไปเหมือนครั้งก่อน... - person Francesco Bonizzi; 29.12.2013
comment
ขออภัยที่ทราบว่า ขอแนะนำให้คุณแจ้งเรื่องนี้กับ Microsoft ที่ connect.microsoft.com ฉันแน่ใจว่าวิศวกรใน Redmond จะสามารถสร้างปัญหาซ้ำได้อย่างรวดเร็วและให้คำแนะนำได้ การรันโปรเจ็กต์ตัวอย่างด้วยตัวเอง (หลายครั้ง) แผงด้านซ้ายหายไปจึงเห็นได้ชัดว่าเป็นรถบั๊กกี้.. - person Jeremy Thompson; 30.12.2013
comment
ยังไงก็ขอบคุณ :) ขอให้เป็นปีที่ดี! - person Francesco Bonizzi; 30.12.2013

โดยทั่วไปจะพบปัญหาดังกล่าวในขณะที่สร้างตัวควบคุมแบบกำหนดเอง สำหรับสิ่งนี้ สร้าง WinFormsGraphicsDevice และวาง exe ที่สร้างขึ้นไปยังเส้นทางต่อไปนี้ของเวอร์ชันของ Visual Studio ที่คุณใช้

C:\Program Files\Microsoft Visual Studio \Common7\IDE

รีสตาร์ท Visual Studio ของคุณและดูว่าปัญหานี้ได้รับการแก้ไขหรือไม่ ฉันประสบปัญหากับการควบคุมแบบกำหนดเองและแก้ไขด้วยวิธีนี้ หวังว่ามันจะเหมาะกับคุณเช่นกัน

person sunnytyra    schedule 16.12.2013
comment
ฉันกำลังลองสิ่งนี้แล้วจะเห็น :) ขอบคุณ! - person Francesco Bonizzi; 16.12.2013
comment
ฉันไม่แน่ใจ แต่สามารถออกแบบการดีบักเวลาเพื่อดูว่าปัญหาอยู่ที่ไหน msdn.microsoft.com/en-us/ ไลบรารี/5ytx0z24%28v=vs.90%29.aspx - person sunnytyra; 17.12.2013

ดูเหมือนว่าจะเกิดจากการอ้างอิงที่ไม่ถูกต้อง ลองดำเนินการต่อไปนี้: ปิดไฟล์ทั้งหมด ทำความสะอาดสารละลายและสร้างใหม่ จากนั้นค้นหาโปรเจ็กต์หรือ dll ที่มีการกำหนดคลาส GraphicsDeviceControl ลบข้อมูลอ้างอิง เพิ่มข้อมูลอ้างอิงอีกครั้ง สร้างใหม่ ลองเปิดการควบคุมอีกครั้ง

person Radin Gospodinov    schedule 17.12.2013

คุณควรพยายามโยน try/catches และใช้เบรกพอยต์และค้นหาข้อยกเว้นด้วย นอกจากนี้ ฉันคิดว่าปัญหาของคุณอ้างถึงบางสิ่งที่มีส่วนประกอบ GUI เช่น SpriteFont, ContentManager, GraphicsDevice...ตัวอย่างเช่น:

content = new ContentManager(Services, "Content"); 

spriteBatch = new SpriteBatch(GraphicsDevice); 

font = content.Load<SpriteFont>("fontName"); // make sure font was loaded fine.
person Ringo    schedule 20.12.2013
comment
จริงๆ แล้วฉันใช้ Visual Studio 2010 pro พร้อมติดตั้งการอัปเดตทั้งหมด - person Francesco Bonizzi; 21.12.2013

ฉันมีปัญหาในตัวออกแบบด้วยรูปแบบที่สืบทอดมาจากรูปแบบอื่น ผู้ออกแบบไม่ต้องการแสดงสิ่งเหล่านี้ ในกรณีของฉัน ผู้ออกแบบแพ้เพราะไม่มีตัวสร้างที่ไม่มีข้อโต้แย้ง โค้ดถูกคอมไพล์และดำเนินการได้ดีเพราะฉันใช้ตัวสร้างที่มี 1 อาร์กิวเมนต์ เพื่อจัดระเบียบโค้ดเล็กน้อย ฉันพยายามลบ Constructor โดยไม่มีข้อโต้แย้ง แต่ฉันต้องนำมันกลับมาเพื่อให้นักออกแบบทำงานได้ คุณอาจลองตั้งค่าคอนสตรัคเตอร์โดยไม่มีอาร์กิวเมนต์ทั้งในตัวควบคุมที่สืบทอดและฐาน

person Guillaume Michel    schedule 20.12.2013