มีอะไรพิเศษเกี่ยวกับ Generic.xaml บ้าง?


153

ฉันพยายามหาวิธีจัดระเบียบไฟล์ ResourceDictionary ของฉันเพื่อนำมาใช้ซ้ำและแบ่งปันกับสมาชิกคนอื่น ๆ ในทีมของฉัน

ฉันเจอ "Generic.xaml" อยู่เรื่อย ๆ แต่ถ้าฉันดู MSDN สำหรับ Generic.xaml หรือทำการค้นหาโดย Google ฉันดูเหมือนจะได้รับโพสต์บล็อกและคำถามในฟอรัมที่พูดถึง - ฉันไม่สามารถดูเหมือน ตีสิ่งที่มีอำนาจและชัดเจนจริงๆ

Generic.xaml และ MyRandomlyNamedResourceDictionary คืออะไรแตกต่างกันอย่างไร ดูเหมือนว่าทั้งสองวิธีฉันต้องอ้างอิง ResourceDictionaries ที่เก็บไว้ในไลบรารีด้วยแอตทริบิวต์ซอร์ส เช่น,:

<Application.Resources>
    <ResourceDictionary
        Source="/CommonLibraryWpfThemes;component/Themes/Generic.xaml"
</Application.Resources>

ดังนั้น Generic.xaml มีประโยชน์อย่างไรบ้าง? มีวัตถุประสงค์หรือไม่ถ้าฉันไม่พยายามให้แอปพลิเคชันของฉัน "ดู" หลายอย่าง (เช่นถ้าฉันมีเพียงธีมเดียว)?


6
คุณไม่จำเป็นต้องรวมในพจนานุกรม generic.xaml ลงในรหัสของคุณหากคุณใช้ด้วยการควบคุมแบบกำหนดเอง (ซึ่งต่างกับการควบคุมผู้ใช้)
Eternal21 21

คำตอบ:


152

ควบคุมทุกคนใน WPF มีสไตล์เริ่มต้นที่ให้ในสิ่งอื่น ๆ ControlTemplateที่เริ่มต้นของการควบคุม WPF ค้นหาสไตล์เริ่มต้นในพจนานุกรมทรัพยากรพิเศษในโฟลเดอร์ Themes ในแอสเซมบลีเดียวกับตัวควบคุม คีย์สำหรับสไตล์เริ่มต้นมีให้โดยControl.DefaultStyleKeyคุณสมบัติการพึ่งพาค่าเริ่มต้นซึ่งจะถูกแทนที่ในแต่ละชั้นย่อยของการควบคุม

ชื่อของพจนานุกรมทรัพยากรขึ้นอยู่กับชุดรูปแบบ Windows ปัจจุบันเช่นใน Vista โดยใช้ชุดรูปแบบ Aero พจนานุกรมชื่อ Aero.NormalColor.xaml บน XP โดยใช้ชุดรูปแบบเริ่มต้นคือ Luna.NormalColor.xaml หากไม่พบสไตล์ในพจนานุกรมธีมมันจะค้นหาใน Generic.xaml เช่นสำหรับตัวควบคุมที่หน้าตาไม่ได้ขึ้นอยู่กับธีม

สิ่งนี้ใช้กับการควบคุมแบบกำหนดเองใด ๆ ที่คุณกำหนดไว้เช่นคลาสที่ได้รับจากการควบคุมโดยตรงหรือโดยอ้อม คุณสามารถเปลี่ยนรูปแบบเริ่มต้นสำหรับตัวควบคุมมาตรฐานได้โดยมาจากรูปแบบนั้นและเรียกDefaultStyleKeyProperty.OverrideMetadataในตัวสร้างสแตติก แต่คุณต้องระบุรูปแบบเต็มรวมถึง ControlTemplate

โปรดทราบว่าคุณสามารถบอก WPF ให้ค้นหาแอสเซมบลีภายนอกสำหรับสไตล์เริ่มต้นของคุณโดยใช้แอตทริบิวต์ ThemeInfo การชุมนุมภายนอกจะต้องมีชื่อYourAssembly< ThemeName .dll เช่น PresententationFramework.Aero.dll><>


ขอบคุณ Phil คุณกำลังบอกว่าถ้าฉันแค่ต้องการให้ ControlTemplate ใหม่สำหรับการควบคุมปุ่มปกติ (เช่นไม่ได้เขียนคลาสพิเศษของตัวเองที่เกิดขึ้นจากปุ่ม) สิ่งนี้จะไม่ถือว่าเป็นส่วนหนึ่งของ "ธีม"
devuxer

ใช่ถ้าคุณเพียงแค่ต้องการเทมเพลตใหม่หรือปรับการควบคุมมาตรฐานอีกครั้งคุณก็ใช้องค์ประกอบทรัพยากรปกติที่ UserControl / Window / Application / ระดับใดก็ได้ คุณสามารถใช้สไตล์พร้อมกับคีย์โดยนัย ( msdn.microsoft.com/en-us/library/… ) เพื่อเปลี่ยนการควบคุมทั้งหมดบางประเภท
Phil Devaney

@Zaheylu มันทำงานได้แล้วในตอนนี้ (ฉันคิดว่า MS กำลังอัปเดตเอกสารของพวกเขา)
Alan McBee - MSFT

104

เพื่อให้generic.xamlไฟล์ (คำนึงถึงขนาดตัวพิมพ์เล็ก) เป็นสิ่งที่พิเศษต้องมีเงื่อนไขสองประการ:

  • จะต้องอยู่ในโฟลเดอร์รูทย่อยของ Themes ในโครงการ
  • การชุมนุมจะต้องทำเครื่องหมายด้วยThemeInfoAttribute(โดยปกติในAssemblyInfo.cs)

จากนั้นจะใช้เป็นตำแหน่งการค้นหาเริ่มต้นสำหรับสไตล์เริ่มต้นที่คุณต้องการใช้กับการควบคุมของคุณ โปรดทราบว่าสำหรับสไตล์ที่จะเป็นค่าเริ่มต้นนั้นจะต้องประกาศทั้ง TargetType และ x: Key เป็นประเภทของการควบคุมที่จะใช้สไตล์

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


3
คุณช่วยอธิบายความหมายของ "สไตล์เริ่มต้น" ได้ไหม? นี่หมายความว่าปุ่มทั้งหมดจะใช้สไตล์ที่ TargetType เป็น "ปุ่ม" โดยอัตโนมัติหรือไม่ หรือฉันยังต้องอ้างอิงx:Keyโดยการเขียน<Button Style="{StaticResource MyButtonStyle}" />? จะเกิดอะไรขึ้นถ้า ResourceDictionary มีสไตล์มากกว่าหนึ่งประเภทที่ TargetType คือ "ปุ่ม" ขอบคุณ
devuxer

3
อีกคำถามหนึ่งที่จะช่วยให้ฉันรู้เรื่องนี้: Generic.xaml เทียบเท่ากับ WPF ของไฟล์ CSS ที่กำหนดรูปลักษณ์เริ่มต้นขององค์ประกอบต่าง ๆ เช่นh1 {color:#00ff00}?
devuxer

3
ใช่สไตล์เริ่มต้นจะใช้โดยไม่ต้องอ้างอิงคีย์อย่างชัดเจนและสไตล์ที่เหมือนกันสองแบบจะให้ข้อผิดพลาดว่ามีคีย์เหมือนกันสองปุ่มในพจนานุกรม และใช่คุณสามารถคิดอย่างนั้นเกี่ยวกับพฤติกรรมเริ่มต้น
Kenan EK

3
เพิ่งต้องการเพิ่มสิ่งนั้นแม้ว่าเป็นจริงที่มีข้อ จำกัด พิเศษในไฟล์ generic.xaml เองรายการพจนานุกรมภายใน generic.xaml สามารถเป็นพจนานุกรมที่ผสานซึ่งรายการอาจอ้างอิงอะไรก็ได้
Tormod
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.