ฉันจะสร้างคลาสย่อยของคลาส Inline ได้อย่างไร (อันที่ใช้ใน FlowDocument)

ใน WPF ฉันต้องการสร้าง Inline การนำไปปฏิบัติ จากเอกสารประกอบของ Inline: "นามธรรม คลาสที่เป็นฐานสำหรับองค์ประกอบเนื้อหาการไหลแบบอินไลน์ทั้งหมด" คลาสเช่น Figure, Run หรือ Span สืบทอดมาจาก Inline

คลาสที่กำหนดเองของฉันสืบทอดมาจาก Inline จะเป็น บางอย่างเช่น '2 ไลน์รัน' ฉันมีความต้องการพิเศษสำหรับการไหลของเอกสาร และดูเหมือนว่าจะเป็นวิธีเดียวเท่านั้น อย่างไรก็ตาม ฉันไม่รู้ว่าจะเริ่มต้นจากตรงไหน: Inline ไม่ได้กำหนดสมาชิกใดๆ! เป็นคลาสนามธรรมดังนั้นจึงมีจุดมุ่งหมายให้สืบทอด แต่ ไม่มีเอกสารประกอบ เกี่ยวกับวิธีการสืบทอดจากคลาสนั้น ไม่ได้อยู่ใน MSDN และไม่มีที่อื่นที่ฉันสามารถหาได้

หากคุณสามารถจัดเตรียมแหล่งข้อมูลออนไลน์ (บทช่วยสอน/บล็อก/บทความ) หรือตัวอย่างโค้ดวิธีสร้างคลาสย่อยของ Inline. เช่น กล่องเปล่าที่มีความกว้างและความสูงพอประมาณ

หากคุณต้องการทราบว่าเหตุใดฉันจึงต้องการสร้างองค์ประกอบ Inline ที่กำหนดเอง โปรดดูคำถาม สร้างตัวแก้ไขคอร์ดกีต้าร์ใน WPF


person Rasto    schedule 27.04.2011    source แหล่งที่มา
comment
หากคุณสามารถระบุลิงก์ไปยังซอร์สโค้ด Run หรือ Span ได้ก็จะมีประโยชน์อย่างยิ่งเช่นกัน   -  person Rasto    schedule 27.04.2011
comment
คุณสามารถใช้ Reflector เพื่อดูโค้ดได้   -  person Thomas Levesque    schedule 27.04.2011
comment
@Thomas Levesque: ฉันจะทำมันแต่คงต้องใช้เวลาสักระยะเพราะฉันไม่เคยใช้ตัวสะท้อนแสงมาก่อน ฉันจะต้องติดตั้งและหาวิธีใช้งาน   -  person Rasto    schedule 27.04.2011
comment
คุณไม่สามารถสืบทอดจาก Run แทนได้หรือไม่?   -  person jv42    schedule 23.12.2011


คำตอบ (1)


คลาสพื้นฐานสามารถใช้เพื่อวัตถุประสงค์ในการเพิ่มความแม่นยำของประเภทเท่านั้น ตัวอย่างเช่น โค้ดในตัวประมวลผล FlowDocument อาจต้องการทำโค้ดเช่น:

if(currentElement is Inline)
{
   // Do something
}

อินไลน์ไม่จำเป็นต้องทำอะไรเลยจริงๆ

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

คุณอาจสามารถเพิ่มคุณสมบัติที่แนบมาและประมวลผลองค์ประกอบลูกที่กำหนดคุณสมบัติเหล่านั้นได้เช่นกัน ตัวอย่างเช่น หากคุณต้องการให้คอนเทนเนอร์ไฮเปอร์ลิงก์อนุญาตให้องค์ประกอบลูกที่แตกต่างกันมีลิงก์ที่แตกต่างกัน คุณสามารถคลาสย่อยจากไฮเปอร์ลิงก์ กำหนดคุณสมบัติลิงก์ที่แนบมาใหม่ และจัดการเหตุการณ์การคลิกสำหรับลูก ๆ ที่แตกต่างจากไฮเปอร์ลิงก์เอง

คุณอาจประสบความสำเร็จได้ด้วยองค์ประกอบ InlineUIContainer และ BlockUIContainer ซึ่งช่วยให้คุณสามารถฝัง UIElement ใด ๆ ไว้ภายในได้ รวมถึง UIElements ที่กำหนดเอง

person Kevin Hsu    schedule 29.04.2011
comment
ฉันเกรงว่าคุณสมบัติที่แนบมาจะไม่ช่วยฉัน - ฉันกำลังพยายาม กำหนดรูปแบบ/พฤติกรรมการแสดงผลข้อความ และข้อความนั้นจะทำงานเหมือนข้อความในเอกสารก็ต่อเมื่อไม่อยู่ในบล็อกใด ๆ (ดังนั้นไม่มี InlineUIContainer ที่มี UIElements หรือ BlockUIContainer แบบกำหนดเองเป็นวิธีแก้ปัญหาที่ถูกต้อง) โดยเฉพาะการเลือกข้อความจะถือว่า InlineUIContainer หรือ BlockUIContainer ทั้งหมดเป็นองค์ประกอบเดียว สำหรับรายละเอียด โปรดดูคำถามของฉัน สร้างตัวแก้ไขคอร์ดกีต้าร์ใน WPF และ คำถามที่เชื่อมโยงอยู่ที่นั่น - person Rasto; 30.04.2011
comment
ฉันคิดว่าคุณอาจจะโชคไม่ดีในเรื่องนี้ หากคุณพบวิธีแก้ปัญหาโปรดแบ่งปัน - person Kevin Hsu; 30.04.2011
comment
ฉันอาจจะ... พวก WPF ที่ออกแบบ FlowDocument ดูเหมือนจะลืมเกี่ยวกับนักกีตาร์ :( มีวิธีแก้ปัญหาสำหรับภาษาโปรแกรมเช่น C# เกือบทุกครั้ง มันอาจจะไม่ง่ายเลย - เหมือนการเขียน WPF ใหม่ครึ่งหนึ่ง คราวนี้ดูเหมือนว่าฉันจะ ต้องเขียนบางอย่างของฉันเอง FlowDocument และ RichTextBox เพื่อขยายบางส่วน :((( - person Rasto; 30.04.2011
comment
@drasto Kevin ถูกต้องในเรื่องนี้ คุณไม่สามารถเปลี่ยนการเรนเดอร์ของ TextElement ใด ๆ คุณสามารถเปลี่ยนคุณสมบัติได้เฉพาะคลาสย่อยเท่านั้น คุณควรทำเครื่องหมายคำตอบของเขาว่ายอมรับแล้ว - person Markus Hütter; 01.05.2011
comment
@ Markus Hütter: หลังจาก 2 คำตอบสุดท้ายของคุณ ฉันถือว่าคุณเป็นผู้มีอำนาจเมื่อพูดถึง FlowDocument ดังนั้นฉันอาจจะยอมรับคำตอบของ Kevins หลังจากผ่านไประยะหนึ่ง (ประมาณเดือนกว่าๆ) ตอนนี้มันได้รับ +1 จากฉันเท่านั้น ฉันสงสัยอยู่แล้วว่าเขาพูดถูก... - person Rasto; 02.05.2011