كيف يمكنني إرساء عناصر WPF عبر نوعها عندما يكون لديهم staticresources؟

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

سؤال

أحتاج إلى إنشاء إنشاء أنواع WPF (قل أو UserControl أو صفحة) عبر التفكير للحصول على مصمم. المشكلة التي أواجهها هي أنه عندما أحاول إنشاء إنشاء هذه باستخدام Activator.CreateInstance أحصل على targetinvocationException. أي يلف، في النهاية، استثناء ألقيته staticresource. تمثال التمديد.

توضيح: الأنواع موجودة في مجموعة مختلفة تم تحميلها في وقت التشغيل!

فيما يبدو، Activator.CreateInstance. لا يمكن إرساء الأنواع التي تستخدم {staticresource xxx} تمثال التمديد، حتى عندما يتم تعريف المورد الثابت في تعريف النوع.

لذلك، إذا كان كل ما لديك هو تعريف النوع التالي (ملف نوع + XAML):

<Page x:Class="Hurr.Durr">
  <Page.Resources>
    <ControlTemplate x:Key="whatever">
      <TextBlock Text="This is a stupid example."/>
    </ControlTemplate>
  </Page.Resources>
  <ContentControl Template="{StaticResource whatever}" />
</Page>

كيف تدور هذا في وقت التشغيل؟

بالمناسبة, ، مطالبة أنك تستخدم DynamicResource بدلا من ذلك غير مقبول. هل يحتاج Visual Studio إلى هذا؟ ومع ذلك، فإن VS قادر على تدور نسخة من عنصر إطار WPF الخاص بك وتلتصق بها في المصمم.


إليك تطبيق عينة (بيتا 2، آسف) الذي يوضح المشكلة.

http://cid-f8be9de57b85cc35.skydrive.live.com/self.aspx/public/resourcesgokaboom.zip.

يحاول التطبيق تحميل صفحة مع رسم في قاموس المورد الخاص به. أحاول تحميله بشكل حيوي باستخدام application.loadcomponent. و Activator.CreateInstance. وكلاهما فشل.


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

ماذا كان يرمي لي كان ذلك هذا يعمل داخل Visual Studio. لذلك في المصمم، يبدو كل شيء OKEY DOKEY ولكن IRL كان كل شكل الكمثرى. IMHO، هذا خطأ وقد أبلغت ذلك على هذا النحو:

https://connnect.microsoft.com/visualstudio/feedback/viewfeedback.aspx؟feedbackid=519244.

لست متأكدا إذا فشل VS إلى .... تفشل، أو إذا كان تمديد StaticResource يعمل في مقابل VS ولكن ليس IRL.

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

المحلول

يبدو أن المشكلة مع الصفحة التي تحاول تحميلها. يبدو أن صفحتك مثل هذا (حذف مجموعة من xmlns وما إلى ذلك السباكة):

<AwesomePage Title="AwesomePage" Background="{StaticResource awesomeface}">
    <AwesomePage.Resources>
        <DrawingBrush x:Key="awesomeface" Stretch="Uniform">
            <!-- details snipped -->
        </DrawingBrush>
    </AwesomePage.Resources>
</AwesomePage>

يحاول هذا استخدام مورد Awesomeface قبل تعريفه. لا يسمح StaticResource هذا النوع من الإشارة إلى الأمام: لذلك فشل staticresourcextension.providevalue وستحصل على الخطأ الذي تواجهه فيه.

لإصلاح هذا، ضع حددا على الفور داخل الصفحة، ونقل Setter في الخلفية من الصفحة إلى الحدود. ثم ضع كل المحتوى الخاص بك داخل الحدود.

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