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

时间:2013-11-18 14:56:48

标签: c# wpf xaml resourcedictionary

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

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

[STAThread]
public static void Main()
{
    MainApplication app = MainApplication.Instance;
    app.Run();
}

不能如何自动导入所有资源同时定义我自己的主资源?

一种解决方案是以编程方式导入它们,例如像这样:

ResourceDictionary dict = new ResourceDictionary();
dict.Source = new Uri("/MyProject;component/MyResourceDictionary.xaml", UriKind.Relative);
Application.Current.Resources.MergedDictionaries.Add(dict);

但是,这个解决方案是不可接受的,因为我希望能够将我的应用程序提供给使用Blend的设计人员,并且可能知道 nothing 关于程序的背景。所以他不会被允许创建新的资源文件,这是不理想的。还有更好的建议吗?

2 个答案:

答案 0 :(得分:1)

强烈建议您将Main()方法保留为默认值。

您在此处尝试实现的目标不需要自定义代码,即使这样做,Main()方法也不适合放置自定义代码。

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

您可以通过System.Windows.Application.Current属性访问WPF中Application对象的“singleton”实例:

因此,如果您将自定义属性放在App类中,请执行以下操作:

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}}"/>

或者,如果您需要访问MainWindow的实例,则可以执行以下操作:

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

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

用于MainWindow的ViewModel中的属性。

答案 1 :(得分:0)

如果你准确地标题了你的问题,比如如何创建一个单独的WPF应用程序?,那么我相信你现在会收到几个回复。但是,幸运的是,我阅读了这些评论并看到了你的评论,说明了这一要求。

网上有很多教程展示了如何实现实际要求。例如,您可以查看使用Mutex类的Sanity Free Coding网站上的C# .NET Single Instance Application页面。如果那个不适合你,只需搜索其他人,直到你找到一个。