لا يتم تحليل ملف app.xaml إذا لم يقم تطبيقي بتعيين بدء التشغيل؟
سؤال
خلفية: أقوم بإنشاء تطبيق 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
صف دراسي.