Nano Hash - криптовалюты, майнинг, программирование

Custom UserControl ломает XAML Designerier и Intellisense

Я работаю над универсальным приложением для Магазина Windows, и в данный момент я сосредоточен на WP8.1. Я создал пользовательский элемент управления UserControl, но всякий раз, когда я включаю этот пользовательский элемент управления в представление с помощью XAML, дизайнеру XAML не удается загрузить представление дизайна. Он просто отображает «Загрузка дизайнера ...» и использует более 60% ЦП.

Обычно меня не интересует представление конструктора, поскольку я предпочитаю напрямую изменять XAML. Проблема в том, что я теряю интеллект, когда дизайнер зависает, на что я полагаюсь при написании XAML.

В моем примере используется элемент управления картой, который будет работать как в приложениях Windows Phone, так и в приложениях Магазина Windows, но у меня была эта проблема и с другими более простыми элементами управления.

Интересно, что XAML Designer отлично работает при работе непосредственно с UserControl. Это проблема только при включении UserControl в XAML другого представления.

Мой UserControl XAML:

<UserControl
    x:Class="MyProject.Controls.MyMapControl"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:MyProject.Control"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300"
    d:DesignWidth="400">

    <Grid>
        <Image x:Name="image" Stretch="UniformToFill" />
    </Grid>
</UserControl>

И код выглядит так

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.Devices.Geolocation;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using System.Threading.Tasks;

#if WINDOWS_PHONE_APP
using Windows.UI.Xaml.Controls.Maps;
using Windows.UI.Xaml.Shapes;
#elif WINDOWS_METRO_APP
using Bing.Maps;
#endif

// The User Control item template is documented at http://go.microsoft.com/fwlink/?LinkId=234236

namespace MyProject.Controls
{
    public sealed partial class MyMapControl : UserControl
    {
        #if WINDOWS_PHONE_APP
        private MapControl map;
        #elif WINDOWS_METRO_APP
        private Map map;
        private MapShapeLayer shapeLayer;
        #endif

        /// <summary>
        /// Creates the MyMapControl with the appropriate credentials
        /// </summary>
        public MyMapControl()
        {
            this.InitializeComponent();
            #if WINDOWS_PHONE_APP
            map = new MapControl();
            map.MapServiceToken = "{map service token goes here}";
            #elif WINDOWS_METRO_APP
            map = new Map();
            map.Credentials = "{credentials go here"};
            shapeLayer = new MapShapeLayer();
            map.ShapeLayers.Add(shapeLayer);
            #endif
            this.main_grid.Children.Add(map);
        }

        #if WINDOWS_PHONE_APP
        public double Pitch {
            get {
                return map.Pitch;
            }
            set {
                if(map.DesiredPitch != value) {
                    map.DesiredPitch = value;
                    OnPropertyChanged("Pitch");
                }
            }
        }

        public MapStyle Style {
            get {
                return map.Style;
            }
            set {
                if(value != map.Style) {
                    map.Style = value;
                    OnPropertyChanged("Style");
                }
            }
        }

        public MapColorScheme ColorScheme {
            get {
                return map.ColorScheme;
            }
            set {
                if(map.ColorScheme != value) {
                    map.ColorScheme = value;
                    OnPropertyChanged("ColorScheme");
                }
            }
        }

        private bool _ShowLocation = true;

        public bool ShowLocation {
            get {
                return this._ShowLocation;
            }
            set {
                if(this._ShowLocation != value) {
                    this._ShowLocation = value;
                    OnPropertyChanged("ShowLocation");
                }
            }
        }
        #endif

        /// <summary>
        /// Get or set the map's ZoomLevel
        /// </summary>
        public double ZoomLevel {
            get {
                return map.ZoomLevel;
            }
            set {
                if(map.ZoomLevel != value) {
                    map.ZoomLevel = value;
                    OnPropertyChanged("ZoomLevel");
                }
            }
        }

        /// <summary>
        /// Get or set the map's manipulation mode
        /// </summary>
        public Windows.UI.Xaml.Input.ManipulationModes ManipulationMode {
            get {
                return map.ManipulationMode;
            }
            set {
                map.ManipulationMode = value;
            }
        }

        /// <summary>
        /// Get or set the map's center point
        /// </summary>
        public Geopoint Center {
            get {
                #if WINDOWS_PHONE_APP
                return map.Center;
                #elif WINDOWS_METRO_APP
                return map.Center.ToGeopoint();
                #endif
            }
            set {
                #if WINDOWS_PHONE_APP
                map.Center = value;
                #elif WINDOWS_METRO_APP
                map.Center = value.ToLocation();
                #endif
                OnPropertyChanged("Center");
            }
        }

        /// <summary>
        /// Get or set the map's credentials
        /// </summary>
        public string Credentials {
            get {
                #if WINDOWS_PHONE_APP
                return map.MapServiceToken;
                #elif WINDOWS_METRO_APP
                return map.Credentials;
                #endif
            }
            set {
                if(!string.IsNullOrEmpty(value)) {
                    #if WINDOWS_PHONE_APP
                    map.MapServiceToken = value;
                    #elif WINDOWS_METRO_APP
                    map.Credentials = value;
                    #endif
                    OnPropertyChanged("Credentials");
                }
            }
        }

        /// <summary>
        /// Get or set the map's display of traffic
        /// </summary>
        public bool ShowTraffic {
            get {
                #if WINDOWS_PHONE_APP
                return map.TrafficFlowVisible;
                #elif WINDOWS_METRO_APP
                return map.ShowTraffic;
                #endif
            }
            set {
                #if WINDOWS_PHONE_APP
                map.TrafficFlowVisible = value;
                #elif WINDOWS_METRO_APP
                map.ShowTraffic = value;
                #endif
                OnPropertyChanged("ShowTraffic");
            }
        }

        /// <summary>
        /// Set the current location for the map view as well as zoom level.
        /// </summary>
        /// <param name="center">BasicGeoposition for the center of the map view</param>
        /// <param name="zoom">Zoom Level at which to display map</param>
        public void SetView(BasicGeoposition center, double zoom) {
            #if WINDOWS_PHONE_APP
            map.Center = new Geopoint(center);
            map.ZoomLevel = zoom;
            #elif WINDOWS_METRO_APP
            map.SetView(center.ToLocation(), zoom);
            #endif
            OnPropertyChanged("ZoomLevel");
            OnPropertyChanged("Center");
        }

        /// <summary>
        /// Adds a basic push pin with text to the map at a specific location.
        /// </summary>
        /// <param name="location">Location for pushpin</param>
        /// <param name="text">Text to display with pushpin</param>
        public void AddPushpin(BasicGeoposition location, string text) {
            #if WINDOWS_PHONE_APP
            Grid pin = new Grid() {
                Width = 34,
                Height = 24,
                Margin = new Thickness(-12)
            };
            pin.Children.Add(new Ellipse() {
                Fill = new SolidColorBrush(Colors.DodgerBlue),
                Stroke = new SolidColorBrush(Colors.White),
                StrokeThickness = 3,
                Width = 24,
                Height = 24
            });
            pin.Children.Add(new TextBlock() {
                Text = text,
                FontSize = 12,
                Foreground = new SolidColorBrush(Colors.White),
                HorizontalAlignment = Windows.UI.Xaml.HorizontalAlignment.Center,
                VerticalAlignment = Windows.UI.Xaml.VerticalAlignment.Center
            });
            MapControl.SetLocation(pin, new Geopoint(location));
            map.Children.Add(pin);
            #elif WINDOWS_METRO_APP
            Pushpin pin = new Pushpin() {
                Text = text
            };
            MapLayer.SetPosition(pin, location.ToLocation());
            map.Children.Add(pin);
            #endif
        }

        /// <summary>
        /// Adds a polygon to the map
        /// </summary>
        /// <param name="locations"></param>
        /// <param name="strokeColor"></param>
        /// <param name="strokeThickness"></param>
        public void AddPolygon(List<BasicGeoposition> locations, Color fillColor, Color strokeColor, double strokeThickness) {
            #if WINDOWS_PHONE_APP
            MapPolygon line = new MapPolygon() {
                Path = new Geopath(locations),
                StrokeColor = strokeColor,
                StrokeThickness = strokeThickness
            };
            map.MapElements.Add(line);
            #elif WINDOWS_METRO_APP
            MapPolygon line = new MapPolygon() {
                Locations = locations.ToLocationCollection(),
                FillColor = fillColor
            };
            shapeLayer.Shapes.Add(line);
            #endif
        }

        /// <summary>
        /// Clears all elements on the map
        /// </summary>
        public void ClearMap() {
            #if WINDOWS_PHONE_APP
            map.MapElements.Clear();
            #elif WINDOWS_METRO_APP
            shapeLayer.Shapes.Clear();
            #endif
            map.Children.Clear();
        }

        /// <summary>
        /// Notify Property Changed Event
        /// </summary>
        public event DependencyPropertyChangedEventHandler PropertyChanged;

        /// <summary>
        /// Notify Property Changed method
        /// </summary>
        /// <param name="propertyName">Name of modified property</param>
        internal void OnPropertyChanged(string propertyName) {

        }
    }
}

  • Вы пытались обойти какой-либо код в конструкторе, если вы находитесь в режиме разработки? stackoverflow.com/questions/28821718 / 09.04.2015
  • Я не смог понять, как обойти код в конструкторе в зависимости от того, нахожусь ли я в режиме разработки или нет, но когда я комментирую все в конструкторе, кроме this.InitializeComponent(), проблема сохраняется. 09.04.2015
  • Вероятно, это директивы #if, окружающие ваши приватные поля вверху. Платформа приложения вряд ли будет определена в режиме разработки, поэтому она задыхается от них. Однако я не знаю обходного пути. 09.04.2015
  • Это хорошая мысль. Я закомментировал директивы #if до и в конструкторе. Однако это не решило проблему. Возможно, позже, когда у меня будет немного больше времени, я попробую удалить их все, чтобы увидеть, не в этом ли проблема. Удаление их всех лишило бы цель контроля, но если бы я мог просто выяснить, что вызывает это, я бы смог найти способ жить с этим. Спасибо, Пол Эббот. 09.04.2015
  • DesignerProperties.GetIsInDesignMode(this) можно использовать, чтобы проверить, находитесь ли вы в режиме разработки. 15.04.2015

Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..