2009-02-12 16 views
34

पृष्ठभूमि: मैं MVVM का उपयोग कर एक WPF अनुप्रयोग बना रहा हूं, और एक डि कंटेनर का उपयोग कर मेरी ViewModels का निर्माण करने केApp.xaml फ़ाइल को पार्स नहीं किया गया है यदि मेरा ऐप स्टार्टअपयूरी सेट नहीं करता है?

मेरे 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 में हार्डकोड किया गया है, जो मैं नहीं चाहता हूं।
कई ब्लॉगपोस्ट और लेख मैं ने पाया मैं StartupUri हटाया, और के मार्गदर्शन के बाद, App.xaml.cs में OnStartup hooking द्वारा MainWindow बनाने की कोशिश की इस तरह:

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

समस्या है, ऐप्लिकेशन क्रैश विंडो को दिखाने का प्रयास करते समय, इस अपवाद के साथ:

'{serviceLocator}' नामक संसाधन नहीं ढूंढ सकता। संसाधन नाम केस संवेदनशील हैं। त्रुटि वस्तु मार्कअप फ़ाइल 'WpfApp; घटक/mainwindow.xaml' में 'System.Windows.Data.Binding' में रेखा 8 स्थिति 45.

जहां तक ​​मेरा बता सकते हैं, <Application.Resources> अनुभाग बस पढ़ नहीं किया जा रहा है xaml फ़ाइल से बाहर। हालांकि कि एक बदसूरत हैक है, और मुझे मदद नहीं करता है अगर मैं App.xaml फ़ाइल में बाद में कुछ और ही रखना चाहते थे

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

: मैं कुछ कोड OnStartup में संसाधन जोड़ने के लिए प्रोग्राम के इस तरह रख सकते हैं ? :-(

मैं किसी अन्य घटना hooking जाना चाहिए वहाँ इस के चारों ओर एक रास्ता है

उत्तर

38

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(); 
    } 
} 
+1

यह हल करता है, धन्यवाद! –

+1

ओएमजी, धन्यवाद! मैंने सोचा कि मैं पागल हो रहा था – Heliac

+1

xaml से ईवेंट सेट करना क्यों महत्वपूर्ण है? यह कन्स्ट्रक्टर से स्थापित होने में विफल रहता है ... –

12

मैंने इसी तरह के एक ही मुद्दे में भाग लिया है। एक वीएस कोड पीढ़ी बग है जहां <Application.Resources> को शेष कार्यक्रम में कनेक्ट करने के लिए आवश्यक कोड कभी-कभी नहीं डाला जाता है जब <Application.Resources> में केवल एक प्रविष्टि होती है और इसमें StartupUri विशेषता नहीं होती है।

विवरण: http://bengribaudo.com/blog/2010/08/19/106/bug-single-application-resources-entry-ignored(अस्वीकरण - लिंक अपने ब्लॉग पर अंक)

+2

.NET Framework 4.5 के साथ विजुअल स्टूडियो 2012 अभी भी एक बग है – Lu55

+0

विजुअल स्टूडियो 2015 में अभी भी बग है :-(मेरे जीवन का एक और तीन घंटे वहां गया। –

17

सबसे सरल समाधान का एक की परिभाषा है x: नाम:

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

अधिक जानकारी: http://connect.microsoft.com/VisualStudio/feedback/details/472729/wpf-cannot-find-resource-defined-in-the-app-xaml-file

+0

लिंक टूटा हुआ है । खोज – Lu55

+0

के माध्यम से भी समस्या नहीं मिल सकती है एक नया जोड़ा गया https://connect.microsoft.com/VisualStudio/feedback/details/772087/ – Lu55

+0

यह समाधान मेरे लिए काम करता है और यह सबसे आसान है। – bignermo

1

इस बग को पाने के लिए आप प्रोग्राम को प्रोग्रामेटिक रूप से जोड़ सकते हैं।

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

यह कोड App कक्षा के लिए कंस्ट्रूटर के अंदर रखा जा सकता है।

संबंधित मुद्दे

 संबंधित मुद्दे