Как отладить пользовательский элемент управления UWP во время разработки - PullRequest
0 голосов
/ 21 сентября 2018

В версии Visual Studio 15.8 мы потеряли (снова) конструктор XAML в проекте UWP, который использует некоторые пользовательские элементы управления.

Когда мы открываем файл XAML в режиме конструктора, он показывает большой желтый цветграницы вокруг некоторых наших пользовательских элементов управления.

enter image description here

Я знаю, что эта желтая рамка появляется, потому что пользовательский элемент управления создает исключение во время разработки.Но у меня нет подробностей об этом исключении.В списке ошибок Visual Studio нет ошибок.Никаких сообщений об ошибках нет ...

Я хотел бы отладить свои пользовательские элементы управления, чтобы я мог решить проблему.Я искал и не могу найти способ отладки в режиме разработки UWP XAML ...

Не могли бы вы рассказать, как я могу отладить или получить более подробную информацию о том, что происходит в режиме разработки?

Редактировать: Я наконец-то получил несколько ошибок в списке ошибок VS: enter image description here enter image description here

(Извините, моя Visual Studio на французском языке),Если я перекомпилирую свое решение, ошибки просто исчезают.Но конструктор все еще непригоден для использования.

Редактировать 2: Вот код для CommandViewModelCollection и CommandViewModel.Эти классы находятся в универсальной библиотеке Windows.Мое приложение UWP ссылается на этот libray:

public class CommandViewModelCollection : ObservableCollection<CommandViewModel>
{
}

public class CommandViewModel : ViewModelBase
{
    public ICommand Command
    {
        get { return _Command; }
        set
        {
            if (_Command != value)
            {
                _Command = value;
                this.OnPropertyChanged(_CommandChangedEventArgs);
            }
        }
    }

    private ICommand _Command;
    private static readonly PropertyChangedEventArgs _CommandChangedEventArgs = new PropertyChangedEventArgs(nameof(Command));

    public ImageSource Icon
    {
        get { return _Icon; }
        set
        {
            if (_Icon != value)
            {
                _Icon = value;
                this.OnPropertyChanged(_IconChangedEventArgs);
            }
        }
    }

    private ImageSource _Icon;
    private static readonly PropertyChangedEventArgs _IconChangedEventArgs = new PropertyChangedEventArgs(nameof(Icon));
}

public abstract class ViewModelBase : INotifyPropertyChanged
{
    protected ViewModelBase()
    {
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(PropertyChangedEventArgs args)
    {
        this.PropertyChanged?.Invoke(this, args);
    }

    public string DisplayName
    {
        get { return _DisplayName; }
        set
        {
            if (_DisplayName != value)
            {
                _DisplayName = value;
                this.OnPropertyChanged(_DisplayNameChangedEventArgs);
            }
        }
    }

    private string _DisplayName;
    private static readonly PropertyChangedEventArgs _DisplayNameChangedEventArgs = new PropertyChangedEventArgs(nameof(DisplayName));
}

1 Ответ

0 голосов
/ 22 сентября 2018

Возможно, в ctor этого пользовательского элемента управления выполняется некоторый код, который может не поддерживаться полностью в конструкторе VS XAML.Вы можете отключить выполнение этого кода во время разработки, используя оператор if с https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.designmode.designmodeenabled#Windows_ApplicationModel_DesignMode_DesignModeEnabled

MS также ввела другое свойство для этого: https://docs.microsoft.com/en-us/uwp/api/windows.applicationmodel.designmode.designmode2enabled#Windows_ApplicationModel_DesignMode_DesignMode2Enabled

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

Обновление: на основе добавленного вами кода мое предложение:

  • ВашCommandViewModelCollection Должен наследовать от DependencyObject, чтобы вы могли начать использовать в нем DependencyProperty.

  • В этом классе определите новый DependencyProperty, например:

    public static readonly DependencyProperty CommandsCollectionProperty = DependencyProperty.Register("CommandsCollection", typeof(ObservableCollection<CommandViewModel>), typeof(CommandViewModelCollection), new PropertyMetadata(new ObservableCollection<CommandViewModel>(), OnCommandsCollectionPropertyChanged));

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

    private static void OnCommandsCollectionPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        //add event handler to monitor the changes to this collection
        var @this = (CommandViewModelCollection)d;
        @this.CommandsCollection.CollectionChanged += @this.OnCommandsCollectionCollectionChanged;
    
        //de-attach from old one
        if (e.OldValue is ObservableCollection<CommandViewModel> oldValue)
            oldValue.CollectionChanged -= @this.OnCommandsCollectionChanged;
    
        //any code here to execute based on collection changes
    }
    

Это должно позволить вам инициализировать коллекцию непосредственно из XAML.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...