لا يتم تحليل ملف app.xaml إذا لم يقم تطبيقي بتعيين بدء التشغيل؟

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

  •  23-08-2019
  •  | 
  •  

سؤال

خلفية: أقوم بإنشاء تطبيق WPF باستخدام MVVM، واستخدام حاوية DI لإنشاء رأيي

يبدو أن App.xaml مثل هذا:

<Application x:Class="WpfApp.App"
    ...xmlns etc...
    StartupUri="MainWindow.xaml">
    <Application.Resources>
        <app:ServiceLocator x:Key="serviceLocator" />
    </Application.Resources>
</Application>

يشبه Mainwindow.xaml

<Window x:Class="CompositeMefWpfApp.MainWindow"
    ...xmlns etc... >
    <Control.DataContext>
        <Binding Path="MainWindowViewModel" Source="{StaticResource serviceLocator}" />
    </Control.DataContext>

الآن، هذا كل شيء يعمل بشكل جيد، ولكن StartupUri هو الصغار في xaml، والتي لا أريدها.
بعد إشراف العديد من Blogposts والمقالات التي وجدتها، أزلت StartupUri, وحاول إنشاء MainWindow عن طريق ربط OnStartup في app.xaml.cs، مثل هذا:

protected override void OnStartup( StartupEventArgs e )
{
    base.OnStartup(e);
    new MainWindow().Show();
}

المشكلة هي، تعطل التطبيق عند محاولة إظهار النافذة، مع هذا الاستثناء:

لا يمكن العثور على الموارد المسماة "{servicelocator}". أسماء الموارد حساسة لحالة الأحرف. خطأ في كائن 'system.windows.data.binding "في ملف العلامات" WPFAPP؛ مكون / Mainwindow.xaml' Line 8 موضع 45.

بقدر ما أستطيع أن أقول، <Application.Resources> لا يتم قراءة القسم من ملف XAML. يمكنني وضع بعض الكود في OnStartup لإضافة المورد برمجيا مثل هذا:

Resources.BeginInit();
Resources.Add("serviceLocator", new ServiceLocator());
Resources.EndInit();

ومع ذلك، هذا اختراق قبيح، ولا يساعدني إذا أردت وضع شيء آخر في ملف App.xaml في وقت لاحق :-(

يجب أن أرقطة أحداث أخرى؟ هل هناك طريقة للتغلب على ذلك؟

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

المحلول

بدلا من تجاوز OnStartup، حاول استخدام حدث بدلا من ذلك:

<Application x:Class="My.App"
    xmlns="..."
    Startup="Application_Startup"
    ShutdownMode="OnExplicitShutdown">
        <Application.Resources>
            <app:ServiceLocator x:Key="serviceLocator" />
        </Application.Resources>
    </Application>

رمز وراء:

public partial class App : Application
{
    public App()
    { }
    private void Application_Startup(object sender, StartupEventArgs e)
    {
        // TODO: Parse commandline arguments and other startup work 
        new MainWindow().Show();
    }
}

نصائح أخرى

أكثر الحل البسيط هو تعريف X: اسم:

<Application x:Name="App" ...
    <Application.Resources>
        ...
    </Application.Resources>
</Application>

معلومات اكثر: http://connnect.microsoft.com/visualstudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file.

لقد واجهت في نفس المشكلة / هذه المشكلة. هناك علة توليد رمز VS حيث الكود الضروري للاتصال <Application.Resources> إلى بقية البرنامج في بعض الأحيان لا يتم إدراجها عندما <Application.Resources> يحتوي على إدخال واحد فقط وليس لديه StartupUri ينسب.

تفاصيل:http://bengribaudo.com/blog/201/201/201/201/0/106/bug-single-application-resources- entry-arabiced. (إخلاء المسؤولية - نقاط الارتباط إلى مدونتي)

للتحول من هذا الخطأ، يمكنك أيضا إضافة الموارد برمجيا.

var rd = new ResourceDictionary()
rd.Source = new Uri("pack://application:,,,/Resources;component/Colors.xaml");
Resources.MergedDictionaries.Add(rd);

يمكن وضع هذا الرمز داخل Conditutor ل App صف دراسي.

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