public MainWindow()
        {
            InitializeComponent();

            trackingUser   = false;
            trackingUserId = 0;
            stop           = false;

            console = new Console();
            console.Show();
            console.Top  = 10;
            console.Left = 10;

            prompt = new UserPrompt();
            prompt.Show();
            prompt.Top  = 10;
            prompt.Left = 550;

            this.Top  = 250;
            this.Left = 550;

            context        = new Context(CONFIG_FILE);
            imageGenerator = new ImageGenerator(context);
            userGenerator  = new UserGenerator(context);

            if (DRAW_SKELETON)
            {
                depthGenerator = new DepthGenerator(context);
                depthBitmap    = new WriteableBitmap(640, 480, DPI_X, DPI_Y, PixelFormats.Rgb24, null);
                depthData      = new DepthMetaData();
                Histogram      = new int[depthGenerator.DeviceMaxDepth];
                skeletonDraw   = new SkeletonDraw();
            }

            poseDetectionCapability = userGenerator.PoseDetectionCapability;
            skeletonCapability      = userGenerator.SkeletonCapability;

            imageBitmap = new WriteableBitmap(640, 480, DPI_X, DPI_Y, PixelFormats.Rgb24, null);
            imageData   = new ImageMetaData();

            Device.SetUp();

            if (File.Exists(SpatialController.CALIBRATION_DATA_FILE))
            {
                spatialController = new SpatialController(ControllerStartup.FromFile, userGenerator);
            }
            else
            {
                spatialController = new SpatialController(ControllerStartup.Calibrate, userGenerator);
            }

            spatialController.RecalibrateCommand += new RecalibrateEventHandler(RecalibrateCommand);

            userGenerator.NewUser  += NewUser;
            userGenerator.LostUser += LostUser;

            skeletonCapability.CalibrationStart += CalibrationStart;
            skeletonCapability.CalibrationEnd   += CalibrationEnd;
            skeletonCapability.SetSkeletonProfile(SkeletonProfile.All);
            poseDetectionCapability.PoseDetected += PoseDetected;
            poseDetectionCapability.PoseEnded    += PoseEnded;

            kinectDataThread = new Thread(new ThreadStart(ReadKinectData));
            kinectDataThread.IsBackground = true;

            checkGesturesThread = new Thread(new ThreadStart(CheckGestures));
            checkGesturesThread.IsBackground = true;

            imageTimer          = new DispatcherTimer();
            imageTimer.Tick    += new EventHandler(ImageTick);
            imageTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);

            kinectDataThread.Start();
            checkGesturesThread.Start();
            imageTimer.Start();

            UserPrompt.Write("Finished loading window.");
            Console.Write("Finished loading window");

            UserPrompt.Write("Please assume the Psi pose and hold it until you see a skeleton overlaid"
                             + " on the streaming video.");
        }
        public MainWindow()
        {
            InitializeComponent();

            trackingUser = false;
            trackingUserId = 0;
            stop = false;

            console = new Console();
            console.Show();
            console.Top = 10;
            console.Left = 10;

            prompt = new UserPrompt();
            prompt.Show();
            prompt.Top = 10;
            prompt.Left = 550;

            this.Top = 250;
            this.Left = 550;

            context = new Context(CONFIG_FILE);
            imageGenerator = new ImageGenerator(context);
            userGenerator = new UserGenerator(context);

            if (DRAW_SKELETON)
            {
                depthGenerator = new DepthGenerator(context);
                depthBitmap = new WriteableBitmap(640, 480, DPI_X, DPI_Y, PixelFormats.Rgb24, null);
                depthData = new DepthMetaData();
                Histogram = new int[depthGenerator.DeviceMaxDepth];
                skeletonDraw = new SkeletonDraw();
            }

            poseDetectionCapability = userGenerator.PoseDetectionCapability;
            skeletonCapability = userGenerator.SkeletonCapability;

            imageBitmap = new WriteableBitmap(640, 480, DPI_X, DPI_Y, PixelFormats.Rgb24, null);
            imageData = new ImageMetaData();

            Device.SetUp();

            if (File.Exists(SpatialController.CALIBRATION_DATA_FILE))
            {
                spatialController = new SpatialController(ControllerStartup.FromFile, userGenerator);
            }
            else
            {
                spatialController = new SpatialController(ControllerStartup.Calibrate, userGenerator);
            }

            spatialController.RecalibrateCommand += new RecalibrateEventHandler(RecalibrateCommand);

            userGenerator.NewUser += NewUser;
            userGenerator.LostUser += LostUser;

            skeletonCapability.CalibrationStart += CalibrationStart;
            skeletonCapability.CalibrationEnd += CalibrationEnd;
            skeletonCapability.SetSkeletonProfile(SkeletonProfile.All);
            poseDetectionCapability.PoseDetected += PoseDetected;
            poseDetectionCapability.PoseEnded += PoseEnded;

            kinectDataThread = new Thread(new ThreadStart(ReadKinectData));
            kinectDataThread.IsBackground = true;

            checkGesturesThread = new Thread(new ThreadStart(CheckGestures));
            checkGesturesThread.IsBackground = true;

            imageTimer = new DispatcherTimer();
            imageTimer.Tick += new EventHandler(ImageTick);
            imageTimer.Interval = new TimeSpan(0, 0, 0, 0, 100);

            kinectDataThread.Start();
            checkGesturesThread.Start();
            imageTimer.Start();

            UserPrompt.Write("Finished loading window.");
            Console.Write("Finished loading window");

            UserPrompt.Write("Please assume the Psi pose and hold it until you see a skeleton overlaid"
                    + " on the streaming video.");
        }