为什么Application.Current
在WinForms应用程序中出现null?应该如何以及何时设置?
我在做:
static class Program {
/// <summary>
/// The main entry point for the application.
/// </summary>
[STAThread]
static void Main() {
Application.Run(new MainForm());
}
}
答案 0 :(得分:20)
Application.Current特定于WPF应用程序。 因此,当您在WinForms应用程序中使用WPF控件时,您需要初始化WPF应用程序的实例。在WinForms应用程序中执行此操作。
if ( null == System.Windows.Application.Current )
{
new System.Windows.Application();
}
答案 1 :(得分:2)
基于其他SO问题,Application.Current是WPF功能而不是WinForm功能。
有MSDN post通过添加对代码的一些引用来说明如何利用Winform中的功能:
您可以先添加对PresentationFramework的引用:
1.在Solution Explorer中,右键单击项目节点,然后单击Add Reference。
2.在“添加引用”对话框中,选择“.NET”选项卡。
3.选择PresentationFramework,然后单击“确定”。
4.添加&#34;使用System.Windows.Shell;&#34;和#34;使用System.Windows;&#34;你的代码。
答案 2 :(得分:1)
恕我直言,其他SO回答并不是真正的Windows窗体,尽管可能不正确。
通常,您会在WinForms中使用ISynchronizeInvoke
这样的功能。每个容器控件都实现此接口。
您需要BeginInvoke()
方法将呼叫编组回适当的线程。
根据您之前的问题,代码将变为:
public class SomeObject : INotifyPropertyChanged
{
private readonly ISynchronizeInvoke invoker;
public SomeObject(ISynchronizeInvoke invoker)
{
this.invoker = invoker;
}
public decimal AlertLevel
{
get { return alertLevel; }
set
{
if (alertLevel == value) return;
alertLevel = value;
OnPropertyChanged("AlertLevel");
}
}
private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
this.invoker.BeginInvoke((Action)(() =>
PropertyChanged(this, new PropertyChangedEventArgs(propertyName))), null);
}
}
}
将拥有的Form
类传递给SomeObject
的构造函数的位置。 PropertyChanged现在将在拥有的表单类的UI线程上引发。