C # WPF указать папки в стиле XAML

Вот что происходит:

  1. Основной метод запускает выполнение
  2. Вы ссылаетесь на Recreate.Car.TESLA
  3. Загрузочный загрузчик классов загружается и инициализировать enum Car. Как отмечено ниже, класс Recreate еще не загружен или не инициализирован.
  4. Инициализатор для TESLA относится к FEATURES
  5. . Это вызывает загрузку класса Recreate и initialized
  6. Как часть статической инициализации Recreate, загружается класс Garage, инициализируется и создается экземпляр ONE_CAR_GARAGE.

Проблема здесь что в этой точке конструкция enum Car не является полной, а Car.TESLA имеет значение null.

Несмотря на то, что классы могут быть вложенными, это не тот случай, когда вложенные классы загружаются и инициализируются как часть инициализации внешнего класса. Они могут выглядеть вложенными в источник, но каждый класс независим. Статические вложенные классы эквивалентны классам верхнего уровня. Нестатические классы также совпадают, но имеют возможность ссылаться на членов в содержащем классе через скрытую ссылку.

Вы можете сами убедиться, если вы запустили это в отладчике, поставили точки останова в нескольких местах и ​​исследовали стек на каждой точке останова.

Я тестировал / отлаживал это в Eclipse с помощью следующий код, с установленными точками останова, где указано. Он немного отличается от вашего кода, но не должен вести себя по-другому:

public class Foo5
{
    static class Recreate {

        private static ArrayList FEATURES = new ArrayList();

        public  enum Car {
          TESLA(FEATURES);
          Car(ArrayList l) { 
              System.out.println("car"); // *** Breakpoint ***
          }
        }
        public static Garage ONE_CAR_GARAGE = new Garage(Car.TESLA);

        public static class Garage {
            final Car car;

            Garage(Car car) {
              this.car = car;  // *** Breakpoint ***
            }
        }
    }

    public static void main(String[] args) throws Exception {
        Recreate.Car car = Recreate.Car.TESLA;
        System.out.println(Recreate.Car.TESLA);
        System.out.println(Recreate.ONE_CAR_GARAGE.car.toString());
    }   
}

Первая точка останова, на которую вы нажмете, будет таковой в конструкторе Garage(Car car). Изучив стек в этой точке, вы увидите

Foo5$Recreate$Garage.<init>(Foo5$Recreate$Car) line: 23 
Foo5$Recreate.<clinit>() line: 17   
Foo5$Recreate$Car.<clinit>() line: 12   
Foo5.main(String[]) line: 29    

. Поэтому, когда вызывается конструктор Garage, он еще не вернулся из создания Car. Это диктуется запутанными зависимостями, которые вы создали между классами, поэтому решение заключается в распутывании зависимостей. Как вы это сделаете, это будет зависеть от ваших конечных целей.

0
задан mrid 20 January 2019 в 06:43
поделиться

1 ответ

На типы ссылаются, используя пространство имен и имя типа, а не через физические пути к файлам.

Таким образом, чтобы сослаться на тип Proj.Views.Dashboard, добавьте соответствующее пространство имен в качестве объявления пространства имен XML и используйте его в атрибуте TargetType, например,

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                xmlns:local="clr-namespace:Proj.Styles"
                xmlns:views="clr-namespace:Proj.Views" >

    <Style x:Key="MyWindowStyle" TargetType="views:Dashboard">
        ....
        ....
    </Style>

</ResourceDictionary>
0
ответ дан Klaus Gütter 20 January 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: