ويمكن استخدام موضوعات WPF لتشمل الجلود متعددة لأحد التطبيقات التي يمكن تغييرها في وقت التشغيل؟

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

سؤال

وWPF يسمح مكتبة التحكم لتوفير القواميس الموارد المختلفة لمواضيع النظام المختلفة، مما يتيح أساسا تطبيق لتتناسب مع موضوع في نظام التشغيل المحدد البصري (ايرو، لونا، الخ).

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

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

المحلول

وهنا مقتطف من التعليمات البرمجية التي اعتدت في طلبي التي تدعم تطبيق السمات. في هذا المثال، لدي موضوعين (التقصير والكلاسيكية XP). يتم تخزين موارد موضوع في DefaultTheme.xaml وClassicTheme.xaml على التوالي.

وهذا هو رمز الافتراضي في بلدي App.xaml

<Application ...>
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="ArtworkResources.xaml" />
                <ResourceDictionary Source="DefaultTheme.xaml" />
            </ResourceDictionary.MergedDictionaries>

            <Style x:Key="SwooshButton" TargetType="ButtonBase">
                <!-- style setters -->
            </Style>

            <!-- more global styles -->
        </ResourceDictionary>
    </Application.Resources>
</Application>

وبعد ذلك في التعليمات البرمجية خلف من App.xaml لدي الأسلوب التالي للسماح لتغيير الموضوع. أساسا، ما عليك فعله هو واضح في قواميس الموارد ومن ثم إعادة تحميل القاموس مع موضوع جديد.

    private Themes _currentTheme = Themes.Default;
    public Themes CurrentTheme
    {
        get { return _currentTheme; }
        set { _currentTheme = value; }
    }

    public void ChangeTheme(Themes theme)
    {
        if (theme != _currentTheme)
        {
            _currentTheme = theme;
            switch (theme)
            {
                default:
                case Themes.Default:
                    this.Resources.MergedDictionaries.Clear();
                    AddResourceDictionary("ArtworkResources.xaml");
                    AddResourceDictionary("DefaultTheme.xaml");
                    break;
                case Themes.Classic:
                    this.Resources.MergedDictionaries.Clear();
                    AddResourceDictionary("ArtworkResources.xaml");
                    AddResourceDictionary("ClassicTheme.xaml");
                    break;
            }
        }
    }

    void AddResourceDictionary(string source)
    {
        ResourceDictionary resourceDictionary = Application.LoadComponent(new Uri(source, UriKind.Relative)) as ResourceDictionary;
        this.Resources.MergedDictionaries.Add(resourceDictionary);
    }

ما عليك أيضا أن نأخذ في الاعتبار مع هذا النهج هو أن أي الأساليب التي تستخدم موضوع سوف تحتاج أن يكون لها الموارد الحيوية. على سبيل المثال:

<Window Background="{DynamicResource AppBackgroundColor}" />

نصائح أخرى

وأنا لا أعرف من وسيلة للقيام بذلك في الإطار، ولكن يمكنك أن تفعل ذلك إذا كنت على غرار كل عنصر تحكم التي يمكن أن تغير نفسك.

وهذه النظرية لجعل أسلوب لDynamicResource ومن ثم تحميل ResourcesDictionary على أساس تكوين المستخدمين لنمط مختلف.

هنا مقال يحتوي على سبيل المثال.

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