2017-02-01 6 views
2

У меня есть общедоступное статическое свойство «inDevMode» в главном окне моего проекта WPF, я устанавливаю это свойство на основе команды line при запуске приложения.C#, что вызывает это странное поведение при доступе к свойству Static в главном окне WPF из App.xaml.cs

MainWindow mainWindow = new MainWindow(); 
if (startInDevMode) 
{ 
    MainWindow.inDevMode = true; 
} 
mainWindow.Show(); 

«MainWindow» внутри фигурных скобок не выделяется серым цветом (который остальные две ссылки типа являются) и при компиляции я получаю сообщение:

'Window' does not contain a definition for 'inDevMode' and no extension method 'inDevMode' accepting a first argument of type 'Window' could be found (are you missing a using directive or an assembly reference?)

Если я изменить то, что находится в пределах Ортезы на ссылки экземпляра (как показано ниже), который я знаю, это неправильно, когда доступ к статическому свойству:

MainWindow mainWindow = new MainWindow(); 
if (startInDevMode) 
{ 
    mainWindow.inDevMode = true; 
} 
mainWindow.Show(); 

Я получаю эту ошибку:

Member 'MainWindow.inDevMode' cannot be accessed with an instance reference; qualify it with a type name instead

Но если я сменил идентификатор экземпляра «mainWindow» на «MainWindow», как показано ниже, я не получу ошибок?

MainWindow MainWindow = new MainWindow(); 
if (startInDevMode) 
{ 
    MainWindow.inDevMode = true; 
} 
MainWindow.Show(); 

и ссылочный тип внутри фигурных скобок («MainWindow») теперь серый

ответ

3

MainWindow является собственностью Application класса, который возвращает Window и этот тип не имеет свойства «inDevMode». Вот почему вы получаете ошибку. У вас конфликт имен.

Можно квалифицировать имя MainWindow типа с пространством имен для того, чтобы быть в состоянии установить статическое свойство:

MainWindow mainWindow = new MainWindow(); 
if (startInDevMode) 
{ 
    WpfApplication1.MainWindow.inDevMode = true; 
} 
mainWindow.Show(); 
+0

Но почему бы переименовать экземпляр «MainWindow» разрешить конфликт имен? – stuicidle

+0

Потому что тогда имя «MainWindow» внезапно ссылается на локальную переменную, которая находится в области действия, а не на свойство, а затем разрешение имени преуспевает. Дополнительную информацию о том, как работает неквалифицированное разрешение имен на C#, см. В следующей ссылке: https://msdn.microsoft.com/en-us/library/aa711882(v=vs.71).aspx. – mm8