我需要在我的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 关于程序的背景。所以他不会被允许创建新的资源文件,这是不理想的。还有更好的建议吗?
答案 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页面。如果那个不适合你,只需搜索其他人,直到你找到一个。