Как обновить ContentControl UI, когда пользовательские свойства меняются во время разработки? - PullRequest
0 голосов
/ 13 октября 2019

У меня есть ContentControl, и у него есть несколько пользовательских Propertities. Сам элемент управления работает нормально, но мне нравится обновлять его интерфейс во время разработки в редакторе XAML. Проблема заключается в следующем: обновление пользовательского интерфейса элемента управления, если я изменю его Size (SizeChanged event сделает это), но я не могу найти способ сделать это, если CustomProperty подобно OffsetX изменяется во время разработки.

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

public sealed class MyControlElement: ContentControl
{
    //
    //SOME INITIALIZE CODE IS HERE
    //

    public MyControlElement() => DefaultStyleKey = typeof(MyControlElement);

    protected override void OnApplyTemplate()
    {
        //
        //SOME INITIALIZE CODE IS HERE
        //

        base.OnApplyTemplate();
    }

    //OFFSET X DESCRIPTION 
    [Description("OffsetX"), Category("MyControlElementParameters"), Browsable(true)]
    //OFFSET X
    public int OffsetX
    {
        get
        {
            return (int)GetValue(OffsetXProperty);
        }
        set
        {
            if (OffsetX != value)
            {
                SetValue(OffsetXProperty, value);
                OnOffsetXChanged(this, new EventArgs());
            }
        }
    }

    public static readonly DependencyProperty OffsetXProperty = DependencyProperty.Register("OffsetX", typeof(int), typeof(MyControlElement), PropertyMetadata.Create(0));
    public event EventHandler OffsetXChanged;
    private void OnOffsetXChanged(object sender, EventArgs e)
    {
        UpdateControlUI();
        this.OffsetXChanged?.Invoke(this, e);
    }
}

1 Ответ

0 голосов
/ 14 октября 2019

Я нашел какой-то "Взлом". Все еще надеемся найти лучшее решение. Следующий трюк работает, и возможно обновить Control интерфейс во время разработки.

Сначала нужно добавить обработчик для Loaded.

    public MyControlElement()
    {
        this.DefaultStyleKey = typeof(MyControlElement);
        this.Loaded += MyControlElement_Loaded;
    }

    private void MyControlElement_Loaded(object sender, RoutedEventArgs e)
    {
        //
        //SOME INITIALIZE CODE HERE IF NEEDED
        //
        //RUN CONTROL VISUAL UPDATER ONLY IF IN DESIGN MODE
        if (DesignMode.DesignModeEnabled) ControlDesignTimeUIUpdater();
        //FLAG - CONTROL HAS BEEN INITIALIZED
        IsControlInitialized = true;
    }

И давайте добавим ControlDesignTimeUIUpdater voidдля обновления пользовательского интерфейса. Этот void имеет цикл для обновления пользовательского интерфейса во время разработки.

    private async void ControlDesignTimeUIUpdater()
    {
        double OldImageWidth = ImageWidth;
        double OldImageHeight = ImageHeight;
        CornerRadius OldImageCornerRadius = ImageCornerRadius;
        double OldBorderThickness = BorderThickness;
        ImageSource OldMyImageSource = MyImageSource;

        while (this.IsLoaded)
        {
            //CHECK CHANGES DELAY 100ms
            await Task.Delay(100);
            //MAKE SURE CONTROL IS INITIALIZED BEFORE ANY UI UPDATES
            if (IsControlInitialized)
            {
                if (OldImageWidth != ImageWidth)
                {
                    OldImageWidth = ImageWidth;
                    SetImageWidth();
                }
                if (OldImageHeight != ImageHeight)
                {
                    OldImageHeight = ImageHeight;
                    SetImageHeight();
                }
                if (OldImageCornerRadius != ImageCornerRadius)
                {
                    OldImageCornerRadius = ImageCornerRadius;
                    SetImageCornerRadius();
                }
                if (OldBorderThickness != BorderThickness)
                {
                    OldBorderThickness = BorderThickness;
                    SetBorderThickness();
                }
                if (OldMyImageSource != MyImageSource)
                {
                    OldMyImageSource = MyImageSource;
                    SetMyImageSource();
                }
                //
                // ETC.
                //
            }
        }
    }

С помощью этого Hack можно обновлять управление в режиме реального времени во время проектирования. Можно даже добавить animations, изменить размер и т. Д.

...