WPF'de Main () yok mu?


128

Programlamaya gelince acemiyim ama evrensel kurallardan birinin bir programın Main () ile başlaması olduğundan emindim. Bir WPF projesi oluşturduğumda bir tane görmüyorum. Main (), WPF'de farklı bir şekilde mi adlandırılır?


13
Eşdeğer işlevselliği, App.xaml.cs içindeki OnStartup'ı geçersiz kılarak elde edebilirsiniz. StartupEventArgs.Args komut satırı argümanlarını içerir.
Foole

1
@Foole, hayır, yapamazsın, bu soruyu gör.
Sinatr

Yanıtlar:


73

Oluşturma sırasında oluşturulur, ancak kendinizinkini sağlayabilirsiniz (gerektiğinde proje özelliklerinde belirsizliği ortadan kaldırarak). Bir uygulama dosyası için obj / debug'a bakın; Şunlara sahibim ("C # 2010 Express" izniyle) App.g.i.cs:

namespace WpfApplication1 {


    /// <summary>
    /// App
    /// </summary>
    [System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks", "4.0.0.0")]
    public partial class App : System.Windows.Application {

        /// <summary>
        /// InitializeComponent
        /// </summary>
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public void InitializeComponent() {

            #line 4 "..\..\..\App.xaml"
            this.StartupUri = new System.Uri("MainWindow.xaml", System.UriKind.Relative);

            #line default
            #line hidden
        }

        /// <summary>
        /// Application Entry Point.
        /// </summary>
        [System.STAThreadAttribute()]
        [System.Diagnostics.DebuggerNonUserCodeAttribute()]
        public static void Main() {
            WpfApplication1.App app = new WpfApplication1.App();
            app.InitializeComponent();
            app.Run();
        }
    }
}

1
Aynı şey içinde App.g.csde var. Ama eklemeye çalıştım Main()ve projemi her yeniden inşa ettiğimde, burada sahip olduğunuz şeye geri dönüyordu. Başka bir sınıfta kendiminkini oluşturmaya çalıştım, ancak Proje Özellikleri yalnızca MyProject.App'i bulur, diğer sınıfı değil, bu nedenle onu yeniden yönlendiremezsiniz.
vapcguy

1
Alternatif olarak, App.xaml.csgörsel stüdyoda açın . Gezinme çubuğu> Yöntem açılır listesini kullanın> Main(gri renkte) öğesini seçin . Bu sizi götürür App.g.i.cs.
P. Brian.Mackey

136

Main () yöntemi otomatik olarak oluşturulur. Kendiniz sağlamak istiyorsanız, yapmanız gerekenler (VS2013 ve VS2017'de test edilmiştir):

  • Çözüm gezgininde App.xaml öğesine sağ tıklayın, Özellikler öğesini seçin.
  • 'Eylemi Oluştur'u' Sayfa 'olarak değiştirin (başlangıç ​​değeri' Uygulama Tanımı'dır)

Ardından, App.xaml.cs'ye bir Main () yöntemi ekleyin. Şöyle olabilir:

[STAThread]
public static void Main()
{
    var application = new App();
    application.InitializeComponent();
    application.Run();
}

2
[STAThread], uygulamanız için COM diş açma modelini ayarlar. Genellikle sadece STA olarak ayarlarsınız ve tam olarak ne yaptığını merak etmenize gerek yoktur. Eğer ilgileniyorsanız msdn.microsoft.com/de-de/library/…
Andreas Kahler

Bunu yapma! Bu, tüm proje için Tasarımcı'daki Stillerde App.xaml'de tanımlanan StaticResources'i kalıcı olarak bozar.
himbeer

13

Main() CLR ve WPF tarafından otomatik olarak sağlanır.

C # derleyicisi, .NET Framework /muygulamasını içeren türü belirten bir komut satırı anahtarını alır Main(). Kural olarak, hiçbir başlangıç ​​nesnesi açıkça belirtilmezse, CLR statik bir Main()yöntemi olan herhangi bir sınıfı arar ve onu çağırır. (@Marc Gravel'in yorumunda belirttiği gibi)

WPF durumunda, Main()oluşturulduğunda otomatik olarak oluşturulur App.xamlve C # derleyicisinin bu sınıfı giriş noktası olarak kullanması için / m anahtarı belirtilir. Ancak proje özelliklerine bakarsanız, başlangıç ​​nesnesini seçmeniz için bir ayar olduğunu göreceksiniz. Yani isterseniz, uygulayan kendi sınıfınızı sağlayabilirsiniz Main().

Bunun, WPF altyapısının düzgün şekilde başlatıldığından emin olmak için Applicationörneği oluşturma ve Run()yöntemini çağırma sorumluluğunu size yükleyeceğini unutmayın.


Aslında olmadan /mo değil bakım türü ne denir; Eğer açık değilse sadece bulmaya çalışır herhangi uygun Mainbir yöntem ve 0 veya birden fazla bulursa şikayet ediyor. Örnek olarak, dil spesifikasyonundaki (§1.1) "Merhaba Dünya" örneği Hello, tür adı olarak kullanır .
Marc Gravell

2
Bilgiçlik taslamak gerekirse: main()CLR (çalışma zamanı) tarafından sağlandığını söylemek gerçekten doğru değil, gerçekten onu oluşturan derleyicidir.
Hank

İzleyicilere kendi Uygulama örneklerine (yani MyApp.App app = new MyApp.App();) eklemeleri .Run()ve önceki gibi çağırmaları gerektiğini hatırlatmak için + 1'im eklendi Main(). İyi karar. Ayrıca, daha app.InitializeComponent();önce eklememiz gerekecek app.Run()ve neyse ki bizim için orijinal InitializeComponent()yöntem hala orada (App.g.cs'de görülüyor, bu yüzden onu tekrar eklemenize gerek yok!).
vapcguy

7

Main()derleme sırasında oluşturulur. Bunu App.g.cs( obj/{Debug,Release}klasörde) bulabilirsiniz.


6

main()bir uygulama için standart bir giriş noktasıdır, ancak tüm uygulamalar bu şekilde yapılandırılmıştır. Bir XAML projesinde, App.XAML dosyası, söylediği giriş noktasını belirtir StartupUri="MainWindow.xaml".

Başkalarının da belirttiği gibi, asıl ana işlev, projedeki XAML dosyalarının içeriğine göre oluşturulur.


1

Ana pencere olmayan başka bir projede yüklenmeyen dosyaları yenisine kopyaladım ve bu hatayı aldım.

Benim için Andreas Kahler'e tam tersi bir yaklaşımı uygulamak gerekiyordu:

Bir pencere dosyası oluşturduktan ve başlangıç ​​uri'sini bu dosyaya ayarladıktan sonra, App.xaml 'Build Action' özelliğinin ApplicationDefinition'ı olarak değiştirdim.


0

Varsayılan App.xaml ve MinWindow.xaml'yi kaldırdıysanız, .csproj'u düzenlemek daha iyidir App.xaml'i manuel olarak ekledikten sonra, .csproj dosyanız şu şekilde olacaktır:

<Page Include ="App.xaml">
       <DependentUpon>MSBuild:Compile</DependentUpon>
       <SubType>Code</SubType>
</Page>

Bunu şu şekilde değiştirin:

<ApplicationDefinition Include="App.xaml">
    <Generator>MSBuild:Compile</Generator>
    <SubType>Designer</SubType>
</ApplicationDefinition>
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.