الأنماط على مستوى التجميع/على مستوى الجذر في مكتبة فئة WPF

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدي مجموعة مكتبة فئة C# (2008/.NET 3.5) تدعم WPF (استنادًا إلى هذا المقال).
لقد قمت بإنشاء عدة نوافذ، وأحاول الآن إنشاء مجموعة أنماط مشتركة لها.ومع ذلك، نظرًا لأنها مكتبة فئة (بدلاً من تطبيق WPF)، ليس لدي app.xaml (والتطبيق المضمن به وApplication.Resources المقابل) لتخزين هذه الأنماط للوصول العالمي.

لذا: كيف يمكنني إنشاء مجموعة عالية المستوى من تعريفات الأنماط التي يمكن رؤيتها بواسطة جميع ملفات xaml في التجميع، نظرًا لأنه ليس لدي app.xaml (انظر أعلاه)؟و/أو هل من الممكن أن يضيف app.xaml العمل إلى مكتبة الفصل؟

لمعلوماتك، لقد حاولت إنشاء ResourceDictionary في ملف ResourceDictionary.xaml، وقمت بتضمينه في كل نافذة داخل كتلة "Window.Resources".اتضح أن ذلك يحل مشكلة تصميم الأزرار، وما إلى ذلك...ولكن ليس للنافذة المرفقة.انا استطيع وضع Style="{StaticResource MyWindowStyle}" في الكتلة المفتوحة للنافذة، ويتم تجميعها وتظهر في نافذة VS Design بشكل جيد، ولكن أثناء وقت التشغيل الفعلي أحصل على استثناء تحليل (تعذر العثور على MyWindowStyle؛أعتقد أن Visual Studio يرى القاموس مضمنًا بعد السطر المعني، لكن قائمة إبطال الشهادات (CRL) تقوم بالأشياء بشكل أكثر تسلسلاً وبالتالي لم تقم بتحميل ResourceDictionary بعد).


شكرا على الأفكار، ولكن لا يوجد حتى الآن...من الواضح أن مكتبة الفصل لا تدعم استخدام generic.xaml ضمنيًا.لقد أضفت generic.xaml إلى مشروع مكتبة الفصل الخاص بي وقمت بتعيين إجراء البناء الخاص به على "المورد".أنه يحتوي على:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Style TargetType="{x:Type Window}" x:Key="MyWindow">
        <Setter Property="Background" Value="Black"/>
    </Style>
</ResourceDictionary>

تبدو نافذة xaml التي أرغب في استخدامها للموضوع كما يلي:

<Window x:Class="MyAssembly.ConfigureGenericButtons"
    x:ClassModifier="internal"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Style="{StaticResource MyWindow}"
    Title="ConfigureGenericButtons">
...Buttons, etc...
</Window>

على الرغم من أن نافذة VS Design لا تعرض النافذة باستخدام نمط MyWindow (أي خلفية سوداء)، إلا أنها تجمع بشكل جيد وتبدأ التشغيل.ومع ذلك، عندما يقوم التطبيق الذي يحتوي على مكتبة الفئة هذه بإجراء استدعاء يؤدي إلى عرض هذه النافذة، أحصل على XamlParseException:

لا يمكن العثور على المورد المسمى '{MyWindow}'.

لقد حاولت أيضًا ترك معلمة النمط، لمعرفة ما إذا كانت النافذة ستستخدم النمط افتراضيًا (وحاولت ذلك مع x:Key في generic.xaml المضمن وبدونه).لا توجد أخطاء، ولكن أي شيء محدد في ملف generic.xaml لم يظهر أيضًا.

هل أفعل شيئًا خاطئًا هنا، أو أي أفكار أخرى حول كيفية السماح باستخدام الأنماط المخصصة الشائعة على النافذة (على سبيل المثال، ليس من الضروري تحديد الأنماط في xaml لكل نافذة) - مع التحذير بأن هذا ليس خطأً طلب؟

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

المحلول

وحاول مضيفا

Style={DynamicResource MyStyle}

وأنت لا يمكن استخدام StaticResource في هذه القضية.

نصائح أخرى

هذا يبدو وكأنه وظيفة لهم.

  1. أضف /themes/generic.xaml ResourceDictionary لمشروعك.
  2. أضف ما يلي إلى AssemblyInfo.cs: [assembly: ThemeInfo(ResourceDictionaryLocation.None, ResourceDictionaryLocation.SourceAssembly)]
  3. ?
  4. ربح!

سيتم استخدام أي موارد تضيفها إلى عام بواسطة كافة عناصر التحكم.يمكنك أيضًا إنشاء سمات محددة للملف الشخصي (Luna وAero وما إلى ذلك) عن طريق تضمين ملف ResourceDictionary باسم السمة الصحيح في ملف ResourceDictionary. themes الدليل.

وهنا رابط لمزيد من المعلومات: إنشاء وتطبيق السمات المخصصة

إذا كنت لا أميل لها app.xaml، لا يزال بإمكانك تحميله في الموارد على مستوى appplication، ولكن لديك لكتابة رمز (لا XAML) للقيام بذلك، مشابهة لهذه ...

void LoadIt()
{
     ResourceDictionary MyResourceDictionary = new ResourceDictionary();
     MyResourceDictionary.Source = new Uri("MyResources.xaml", UriKind.Relative);
     App.Current.Resources.MergedDictionaries.Add(  MyResourceDictionary )
}

وتحقق من هذا الموقع للحصول على مثال: <الصورة> HTTP: // ascendedguard كوم / 2007/08 / واحد من بين ميزات طيفة عن برنامج الأغذية العالمي، هو بين how.html

د. برنامج الأغذية العالمي (أو الشخص المعروف سابقا باسم الدكتور WPF) لديه كبير <وأ href = "http://drwpf.com/blog/2007/10/05/managing-application-resources-when-wpf-is-hosted/ "يختلط =" نوفولو "> آخر على هذا الموضوع.

وفيما يلي مقتطف من آخر حيث أنها تخلق كائن التطبيق وإضافة موارد:

if (Application.Current == null)
{
    // create the Application object
    new Application();

    // merge in your application resources
    Application.Current.Resources.MergedDictionaries.Add(
        Application.LoadComponent(
            new Uri("MyLibrary;component/Resources/MyResourceDictionary.xaml",
            UriKind.Relative)) as ResourceDictionary);
}

وبما أن استضافت جمعية بلدي عن طريق إمكانية التشغيل المتداخل كان لي أن أضيف وضع ShutdownMode على النحو التالي والاغلاق عند الانتهاء:

new Application() { ShutdownMode = ShutdownMode.OnExplicitShutdown };

وعملت مثل السحر.

وإذا قمت بتحميل في Window.Resource، القاموس متاح فقط للأطفال من تلك النافذة. تحتاج إلى أن يكون في متناول لالنافذة وأبنائها.

وحاول تحميله في ملف app.xaml الخاص بك. يجب أن جعله موردا مستوى التطبيق، وليس موردا على مستوى النافذة.

لذا، وبعد قضاء الكثير من الوقت، اكتشفت ذلك أخيرًا.إليك الطريقة:

  1. في مكتبة عناصر تحكم WPF، قم بإضافة مجلد جديد باسم themes.
  2. داخل themes المجلد، أضف قاموس الموارد المسمى generic.xaml.
  3. داخل generic.xaml, ، قم بإضافة المورد الخاص بك باستخدام بناء الجملة التالي:

    <SolidColorBrush x:Key="{ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}" Color="Blue" />
    
  4. في عنصر التحكم الخاص بك، استخدم بناء الجملة التالي للوصول إلى هذا المورد:

    Background="{StaticResource {ComponentResourceKey {x:Type local:UserControl1}, MyEllipseBrush}}"
    

أشياء يجب ملاحظتها:

  1. عادةً ما يتم تنفيذ الخطوتين 1 و2 تلقائيًا بواسطة Visual Studio عند إنشاء مكتبة عناصر تحكم WPF جديدة.
  2. أنا لا أفهم تماما الغرض من ComponentResourceKeyالمعلمة الأولى، ولكنها مطلوبة.استخدم اسم عنصر التحكم الذي سيستهلك هذا المورد.
  3. لم يتمكن مصمم Visual Studio من تحديد موقع المورد في حالتي.من الممكن أن تكون مشكلة في ذاكرة التخزين المؤقت، لست متأكدًا.في وقت التشغيل ولكنه يعمل بدقة.
  4. يمكنك قراءة المزيد من التفاصيل حول بناء الجملة هذا في مقالة MSDN هذه.

آمل أن يجعل هذا بعض الحياة أسهل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top