كيفية الرجوع إلى مفاتيح نمط WPF المحددة في مجموعة منفصلة في مكتبة أخرى

StackOverflow https://stackoverflow.com/questions/2184871

سؤال

لديّ مكتبان وتخطيط لمشروع تجميع تطبيق واحد وأتساءل كيف يمكنني الرجوع إلى الأساليب من خلال مفتاحهما في إحدى مكتباتي المحددة في الآخر.

تخطيط الحل الخاص بي:

  • wpfcontrols.dll - يحمل عناصر تحكم قابلة لإعادة الاستخدام العامة مثل التحكم في Numericupdown المستند إلى WPF بالإضافة إلى عناصر التحكم الأساسية الأخرى وبعض الأساليب التي أود أن أجعلها قابلة لإعادة الاستخدام. من أجل المثال ، دعنا نقول أن مفتاح الأسلوب الخاص بي هنا محدد على أنه MyButtonstyle.
  • متخصصة Controls.dll - يحمل عناصر تحكم متخصصة في تطبيقنا مثل عناصر التحكم المركبة المخصصة و UserControls في WPF. هذا هو المكان الذي أود الإشارة إليه MyButtonstyle الأسلوب المحدد في مجموعة WPFControls.dll.
  • application.exe - يستخدم هذا التجميع عناصر التحكم المحددة في مجموعة SecimentizedControls.dll.

لقد رأيت بعض الأمثلة التي تشرح كيفية القيام بذلك من خلال مكتبة تحكم واحدة بسيطة وتجميع التطبيق ولكن في حالتي لديّ تجميعين وتطبيق. وبعبارة أخرى في حالتي ، ليس لدي app.xaml في مكتبة التحكم الثانية حيث يمكنني استخدام مفهوم الاندماج. أنا متأكد تمامًا مما إذا كنت أرغب في الحصول على مرجع DergedDictionaries مباشرة في كل عنصر تحكم XAML لدمج كل عام. في مجموعة SecimentizedControls التي لا تبدو أفضل حل. ومما زاد الطين بلة ، قد يتم أيضًا دمج هذه القواميس في التطبيق.

هل يمكن لأي شخص أن يوضح ما هو النهج الموصى به أو الأفضل لمشاركة مثل هذه الأساليب بأقل قدر من البرمجة والموارد.

تحديث: بعد إجراء المزيد من الاختبارات ، يبدو أنني أواجه مشكلة في الرجوع إلى أي مورد محدد داخل generic.xaml بواسطة مفتاحه حتى داخل نفس التجميع. قد يكون هناك شيء خاطئ تمامًا حول كيفية فهم كيفية عمل مفاتيح الموارد ، لذا سأضطر إلى مزيد من البحث بالإضافة إلى النظر في ComponentResourceKey. إذا كان لدى أي شخص أي تلميحات أو اقتراحات ، الرجاء المساعدة.

هل كانت مفيدة؟

المحلول

يعمل البحث في الموارد في WPF في التسلسل الهرمي: UP الشجرة المنطقية ، ثم موارد التطبيق ، وموارد الموضوع ، وأخيرا موارد النظام.

يمكن عادة الوصول إلى موارد الموضوع ضمنيًا فقط (حتى داخل التجميع يتم تعريفها). هذا مهم فقط للأنماط ، حيث يمكن استخدام TargetType كمفتاح ضمني.

لإنجاز ما تحاول القيام به ، هناك خياران:

  • إستخدم ComponentResourceKey. هذا مفتاح موارد خاص يسمح بالمرجعية من التجميعات الأخرى. على سبيل المثال ، يمكنك تحديد فرشاة WPFControls القاموس الموضوع:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}">
        <GradientStop Color="Red" />
        <GradientStop Color="Blue" Offset="1" />
    </LinearGradientBrush>
    

    وبعد ذلك يمكنك الرجوع إليه متخصصون:

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" />
    
  • يستخدم اندماجي لاستيراد القاموس في موارد التطبيق. يمكنك القيام بذلك في تطبيق التجميع ، وعندما يتم تحميل التطبيق ، حتى عناصر التحكم الموجودة متخصصون سيكون قادرا على استخدام هذه الموارد. سيكون لديك مشكلة في تجربة وقت التصميم في هذا السيناريو ، والتي يمكنك حلها عن طريق وضع تطبيق مزيف. xaml في متخصصون, ، قد يحتوي هذا أيضًا على إشارة إلى القاموس.

أتمنى أن يساعدك هذا،

aelij.

نصائح أخرى

الإجابة المقبولة صحيحة ، أنا فقط أشرح كيفية الاستخدام اندماجي

في app.xaml,

    <Application.Resources>
      <ResourceDictionary>
         <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/-DirectoryName-/FileName.xaml"/>
            <!-- Use Below syntax if your resource file is not inside a directory(in root) -->
            <ResourceDictionary Source="pack://application:,,,/-YourDllName-;component/FileName.xaml"/>
         </ResourceDictionary.MergedDictionaries>
      </ResourceDictionary>
    </Application.Resources>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top