C# 如何声明自己的Main()和导入ResourceDirectory

C# 如何声明自己的Main()和导入ResourceDirectory,c#,wpf,xaml,resourcedictionary,C#,Wpf,Xaml,Resourcedictionary,我需要在我的WPF应用程序中自定义Main()方法,因此我关闭了Main的自动生成,方法是将我的App.xaml的构建操作更改为“Page”(而不是“ApplicationDefinition”)。但是,我还需要使用ResourceDictionary,如果App.xaml未标记为“ApplicationDefinition”,则不会导入任何资源(我尝试了这个,请参阅) 我需要一个自定义的Main()方法,因为应用程序必须是单例的,Main只需读取: [STAThread] public sta

我需要在我的WPF应用程序中自定义
Main()
方法,因此我关闭了Main的自动生成,方法是将我的
App.xaml
的构建操作更改为“Page”(而不是“ApplicationDefinition”)。但是,我还需要使用
ResourceDictionary
,如果
App.xaml
未标记为“ApplicationDefinition”,则不会导入任何资源(我尝试了这个,请参阅)

我需要一个自定义的
Main()
方法,因为应用程序必须是单例的,Main只需读取:

[STAThread]
public static void Main()
{
    MainApplication app = MainApplication.Instance;
    app.Run();
}
否如何自动导入所有资源并同时定义自己的main

一种解决方案是通过编程方式导入它们,例如:

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("/MyProject;component/MyResourceDictionary.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(dict);
public partial class App : Application
{
    public string MyString { get; set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MyString = "I'm a string in the App class";
    }
}

但是,这种解决方案是不可接受的,因为我希望能够将我的应用程序交给使用Blend的设计师,而他可能对程序的背景一无所知。因此,他将不被允许创建新的资源文件,这是不理想的。有更好的建议吗?

如果你的问题标题准确,比如如何创建单例WPF应用程序,那么我相信你现在已经收到了好几封回复。然而,幸运的是,我读了评论,看到你的评论说明了这一要求


网上有很多教程展示了如何满足您的实际需求。例如,您可以查看使用
Mutex
类的Sanity Free编码网站上的页面。如果该方法不适合您,只需搜索其他方法,直到找到适合您的方法。

Istrong建议您将
Main()
方法保留为默认方法

您在这里试图实现的目标不需要自定义代码,即使它需要自定义代码,
Main()
方法也不是放置自定义代码的正确位置

您不需要为WPF中的
应用程序
对象创建“singleton”属性,因为WPF已经这样做了

您可以通过以下属性访问WPF中
应用程序
对象的“singleton”实例:

因此,如果将自定义属性放入
App
类中,如下所示:

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("/MyProject;component/MyResourceDictionary.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(dict);
public partial class App : Application
{
    public string MyString { get; set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
        MyString = "I'm a string in the App class";
    }
}
然后您可以在XAML中访问它:

<TextBox Text="{Binding MyString, Source={x:Static Application.Current}}"/>



对于主窗口的ViewModel中的属性。

我需要在我的WPF应用程序中自定义Main()方法
-为什么?因为我需要它是一个单例,从而引用主窗口中对象的实例,而不是创建一个
新的
方法。您应该在
OnStartup()中这样做
app.xaml.cs
中的
。不要使用
Main()
,也不要使用
ApplicationDefinition
。好的,您可以更具体地说明如何在
OnStartup()中执行该操作吗?因为现在正在为我生成一个
Main()
方法,没有机会将其更改为类似于单例的调用。“因此他将不被允许创建新的资源文件”-此设计器将非常有趣。抱歉,我试图尽可能准确地给出我的问题的标题,但是,如果你不知道答案,就很难提出一个问题。请随意推荐一个您认为更准确的标题。如果您的总体要求是“创建单例WPF应用程序”,那么您的标题可能是“如何创建单例WPF应用程序?”。总的想法是把你想要达到的目标放在你的标题中,并在问题中给出确切的细节。不管怎样,这对我们来说都不是问题。。。这对你来说可能是个更大的问题。作为旁注,这个链接对你有用吗。。。这就是你一直在寻找的东西,还是我误解了你的要求?我并不认为这是有帮助的。我知道互斥体/单实例应用程序/单实例,但我看不出使用实例方式有什么问题(比如:)。我使用它是因为它可以很容易地设置到主应用程序的绑定,这是本论坛其他地方的一个建议。我真正的问题是:为什么当应用程序定义自己的Main()时,
ResourceDictionary
突然不起作用了?@Yellow将singleton
属性放在任何地方都没有错。但这将
而不是
使您的应用程序
成为单个实例
。我不确定这是否是你想要达到的目标。是的,如果你弄乱了WPF的默认启动机制,它就不能正常工作。再一次,离开
Main()
aloneI从来没有说过,我使用实例的原因仅仅是为了使到静态属性的绑定容易工作,因此需要稍微调整Main()方法。直到很久以后,在GUI设计阶段,我发现这是有问题的,原因我不明白。这是我真正的问题,不是单身汉的问题。谢谢,这确实很有帮助。遗憾的是,单例方法不起作用。我知道可以绑定到静态变量(但感谢您提供了有用的示例),但是
PropertyChanged
事件使用这种绑定时非常奇怪。因此,几乎所有人都建议使用单例模式。但我想在这些例子中,仍然有一种方法可以解决这个问题。