ResourceDictionary ในชุดประกอบแยกต่างหาก


245

ฉันมีไฟล์พจนานุกรมทรัพยากร (MenuTemplate.xaml, ButtonTemplate.xaml และอื่น ๆ ) ที่ฉันต้องการใช้ในหลายแอปพลิเคชันแยกกัน ฉันสามารถเพิ่มพวกมันลงในชุดประกอบของแอปพลิเคชันได้ แต่จะดีกว่าถ้าฉันรวบรวมทรัพยากรเหล่านี้ในแอสเซมบลีเดียวและให้แอปพลิเคชันของฉันอ้างอิงได้ใช่ไหม

หลังจากสร้างแอสเซมบลีของทรัพยากรฉันจะอ้างอิงใน App.xaml ของแอปพลิเคชันของฉันได้อย่างไร ขณะนี้ฉันใช้ ResourceDictionary.MergedDictionaries เพื่อรวมไฟล์พจนานุกรมแต่ละไฟล์ ถ้าฉันมีพวกเขาในการชุมนุมฉันจะอ้างอิงพวกเขาเป็น xaml ได้อย่างไร?


1
นี้อาจจะเป็น overkill แต่คุณอาจต้องการที่จะเตรียมความพร้อมทรัพยากรของคุณเพื่อการส่งออกโดยใช้เทคนิคที่อธิบายที่นี่: alexfeinberg.wordpress.com/2015/08/16/... ข้อได้เปรียบหลักของการทำเช่นนี้คือเพื่อป้องกันปัญหาเกี่ยวกับแอสเซมบลีทรัพยากรหลายรุ่นโหลดลงใน appdomain เดียวกัน
user195275

คำตอบ:


353

ตรวจสอบแพ็ค URI ไวยากรณ์ คุณต้องการสิ่งนี้:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
จะเกิดอะไรขึ้นถ้า YourAssembly ไม่มีอยู่ในพา ธ ของแอปพลิเคชัน
SaneDeveloper

@Engineer Spock: ดังนั้น CLR จะไม่พบมันหากไม่มีความช่วยเหลือ (ไม่มีอะไรเกี่ยวข้องกับ WPF) เพิ่มละเอียดเส้นทางที่คุณapp.configหรือแนบไปAppDomain.AssemblyResolveเพื่อช่วยให้มันหาการชุมนุม
Kent Boogaart

1
ฉันต้องเพิ่มเส้นทางการตรวจสอบหากโครงการ YourAssembly อยู่ในระดับเดียวกับโครงการแอปพลิเคชันที่ต้องการอ้างอิง YourAssembly หรือไม่ ตัวอย่างเช่น C: \ Solution \ AppProject \ และ C: \ Solution \ YourAssemblyProject \
SaneDeveloper

1
@EngineerSpock: นี่เป็นคำถามแยกต่างหากดังนั้นโปรดเปิดหนึ่งคำถาม
Kent Boogaart

2
คำตอบนี้ไม่สมเหตุสมผล ในการที่จะติดตามมันจำเป็นต้องรู้วิธีการทำ!
user1040323

97

ตัวอย่างเพียงเพื่อให้คำตอบนี้ 15 วินาที -

สมมติว่าคุณมี "styles.xaml" ในไลบรารี WPF ชื่อ "common" และคุณต้องการใช้จากโครงการแอปพลิเคชันหลักของคุณ:

  1. เพิ่มการอ้างอิงจากโครงการหลักไปยังโครงการ "ทั่วไป"
  2. app.xaml ของคุณควรมี:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

ไชโย


2
แล้วคุณจะทำให้ทรัพยากรที่กำหนดไว้ใน styles.xaml พร้อมใช้งานผ่านหน้าต่างคุณสมบัติ Visual Studio 2010 ได้อย่างไร ถ้าฉันเลือกองค์ประกอบแล้วคลิกใช้ทรัพยากรสำหรับคุณสมบัติพื้นหลังจะแสดงเฉพาะ SystemColors และไม่ได้กำหนดไว้ใน styles.xaml แต่ถ้าฉันพิมพ์ชื่อทรัพยากรใน XAML ตัวเองมันทำงานได้ดังนั้นมันถูกอ้างอิงอย่างถูกต้อง
xr280xr

แค่อยากจะเพิ่มว่าถ้าคุณอ้างอิง ResourceDictionary จาก UserControl คุณจะต้องเพิ่มการอ้างอิงไปยังแอสเซมบลีทั้งสองแห่ง: ใน UserControl และในโครงการหน้าต่างหลัก มิฉะนั้นคุณจะได้รับข้อผิดพลาด runtime
Andrejs Gasilovs


16

DLL ของทรัพยากรเท่านั้นเป็นตัวเลือกสำหรับคุณ แต่ไม่จำเป็นต้องมีเว้นแต่คุณต้องการแก้ไขทรัพยากรโดยไม่ต้องรวบรวมแอปพลิเคชันใหม่ มีเพียงหนึ่งไฟล์ ResourceDictionary ทั่วไปก็เป็นตัวเลือก ขึ้นอยู่กับว่าคุณเปลี่ยนทรัพยากรและอื่น ๆ บ่อยแค่ไหน

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly - เพียงชื่อแอสเซมบลีที่ไม่มีส่วนขยาย

FolderStructureInAssembly - หากทรัพยากรของคุณอยู่ใน folde ให้ระบุโครงสร้างโฟลเดอร์

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

WPF รองรับสองหน่วยงาน: application: /// และ siteoforigin: /// แอปพลิเคชัน: /// ผู้มีอำนาจระบุไฟล์ข้อมูลแอปพลิเคชันที่รู้จักในเวลารวบรวมรวมถึงทรัพยากรและไฟล์เนื้อหา Siteoforigin: /// อำนาจระบุไซต์ของไฟล์ต้นฉบับ ขอบเขตของแต่ละหน่วยงานจะแสดงในรูปต่อไปนี้

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



4

ใช้ XAML:

หากคุณรู้จักassemblyโครงสร้างอื่น ๆและต้องการresourcesในรหัสc #ให้ใช้รหัสด้านล่าง:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

ผลลัพธ์:ถ้าเราต้องการใช้ResourceDictionary RD1.xamlProject WpfControlLibrary1ในStackOverflowAppโครงการ

โครงสร้างของโครงการ :

โครงสร้างของโครงการ

พจนานุกรมทรัพยากร: พจนานุกรมทรัพยากร

รหัสออก:

เอาท์พุต

PS:ResourceDictionaryไฟล์ทั้งหมดควรมีBuild Actionรูปแบบ ' Resource' หรือ ' Page'

ใช้ C #:

หากใครต้องการคำตอบในรหัส cหมดจดแล้วดูโซลูชันนี้ของฉัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.