تجنب أخطاء مصممة مصمم Visual Studio عند تعريف مورد WPF في مشروع منفصل

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

سؤال

كيف يمكنني تجنب أخطاء مصمم Visual Studio عند تعريف مورد WPF في مشروع منفصل؟

لدي ثلاثة مشاريع في تطبيق WPF مركب: التطبيق الرئيسي، مكتبة "البنية التحتية"، ومكتبة "وحدة". يشير التطبيق الرئيسي إلى المشاريع الأخرى عبر DLLs الإخراج (المشاريع غير موجودة في حل واحد معا).

أنا أعرف الجلد (بعض الفرش والأساليب في ResourceDictionary) في مكتبة "البنية التحتية". أرغب في التطبيق الرئيسي لتحديد جلد وجعله متاحا للتطبيق بأكمله (عبر MergedDictionaries في app.xaml).

في الوحدة النمطية التي أريد استخدام الموارد المحددة في الجلد الذي يتم تحميل التطبيق الرئيسي. إذا قمت بالإشارة إلى المورد كما لو كانت متوفرة محليا مثل هذا:

Background={StaticResource MainBackgroundBrush}

كل شيء تقريبا يعمل حسب الرغبة. الاستثناء هو أن مصمم Visual Studio يحصل على حيرة ويخبرني أنه لم يتم العثور على "المرجع السياسي المرجع" Maimbackgroundbrush ". هذا يمنعني بشكل فعال من استخدام المصمم.

ماذا يمكنني أن أفعل لتحديد "الجلد" ResourceDictionary في مشروع، مرجع أن الجلد في التطبيق الرئيسي، ثم استخدم موارده في مشروع وحدة؟

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

المحلول 2

حل واحد ممكن هو استخدام DynamicResource بدلا من StaticResource. وبعد يعرض مصمم Visual Studio 2008 ببساطة عناصر التحكم دون أي تصفيف، مثل VS2010 Beta 1 لا يحدث عندما لا يمكن حل أ StaticResource.

استخدام DynamicResource مناسب في المواقف التي قد يتغير فيها أسلوب معين في وقت التشغيل، مثل عندما الجلد.

لقد وجدت بعض الأسئلة ذات الصلة تدعم هذا:

لقد وجدت أيضا شخصا ينص على ذلك DynamicResource يجب أن تستخدم كلما لم يكن مورد محلي:

نصائح أخرى

يمكنك إنشاء فئة الموارد الخاصة بك، والورث من Revidentionaryary. ثم يمكنك ترتيب ذلك في وقت التصميم، يتم تحميل هذه الموارد المخصصة هذه الأنماط المعرفة بشكل صريح (أي تلك التي تم تحميلها من التطبيق في وقت التشغيل)، في حين أن وقت التشغيل لا يفعل شيئا على الإطلاق. يمكن تقييم خاصية ISINDESGIGNMODE لهذا.

قل أن لديك مثل هذا الفصل، ودعا "designtimeresourctionary"، فأنت فقط تستخدم S.th. مثل

 <UserControl.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <Util:DesignTimeResourceDictionary Source="SomeUriToYourResources"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
 </UserControl.Resources>

لتحميل الموارد الخاصة بك في وقت التصميم وجعل عمل المصمم. في وقت التشغيل، يمكنك ذلك، ثم قم بتخطي Designtimeresourcistionary الخاص بك تحميل الموارد وتحقيق السلوك المطلوب.

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

أريد فقط أن تمديد سيمون D. الإجابة. ما يقترحه هو الحل الذي أستخدمه الآن. أردت فقط مشاركة شفرة المصدر كاملة. من هذا خدعة لاستخدام doefledionary فقط عند في وضع التصميم مصدر.

public class DesignTimeResourceDictionary : ResourceDictionary
{
    /// <summary>
    /// Local field storing info about designtime source.
    /// </summary>
    private string designTimeSource;

    /// <summary>
    /// Gets or sets the design time source.
    /// </summary>
    /// <value>
    /// The design time source.
    /// </value>
    public string DesignTimeSource
    {
        get
        {
            return this.designTimeSource;
        }

        set
        {
            this.designTimeSource = value;
            if ((bool)DesignerProperties.IsInDesignModeProperty.GetMetadata(typeof(DependencyObject)).DefaultValue)
            {
                base.Source = new Uri(designTimeSource);
            }
        }
    }

    /// <summary>
    /// Gets or sets the uniform resource identifier (URI) to load resources from.
    /// </summary>
    /// <returns>The source location of an external resource dictionary. </returns>
    public new Uri Source
    {
        get
        {
            throw new Exception("Use DesignTimeSource instead Source!");
        }

        set
        {
            throw new Exception("Use DesignTimeSource instead Source!");
        }
    }
}

<Window x:Class="WpfApplication1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation Jump "
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml Jump "
    Title="MainWindow" Height="350" Width="525"
    xmlns:local="clr-namespace:WpfApplication1">

  <Window.Resources>
    <local:DesignTimeResourceDictionary DesignTimeSource="pack://application:,,,/BlueColors.xaml"/>
  </Window.Resources>

    <Grid>
      <Button Background="{DynamicResource defaultBackground}"
      HorizontalAlignment="Center" VerticalAlignment="Center">click me</Button>
    </Grid>
</Window>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top