Дочерняя инициализация пользовательской панели WPF - PullRequest
0 голосов
/ 07 октября 2019

В настоящее время я работаю над пользовательской реализацией Panel (на основе Canvas) с определенным поведением.

Так как мне нужно сделать несколько действий в зависимости от дочерних свойств. Чтобы реализовать элемент управления, я также разработал специальный дочерний элемент управления (на основе ContentControl) с некоторыми свойствами зависимостей, чтобы настроить дочерний параметр непосредственно в xaml.

Поскольку мне также необходимо выполнить проверку в AddChildВо время вызова я перехватываю вызов AddChild, определяя атрибут [ContentProperty("NotifiableChildren")] в моем элементе управления, а затем выполняю некоторые проверки перед добавлением дочерних элементов в дочерние элементы Canvas.

    public interface INotifiableParent
    {
        int AddChild(UIElement child);
        void RemoveChild(UIElement child);
    }

    [ContentProperty("NotifiableChildren")]
    public class MyPanel : Canvas, INotifiableParent
    {
        public MyPanel()
        {
            NotifiableChildren = new NotifiableUIElementCollection(this, this);
        }

        public NotifiableUIElementCollection NotifiableChildren { get; }


        #region INotifiableParent members

        public int AddChild(UIElement child)
        {
            // Add your custom code here

            // Add the child to the InternalChildren
            return this.Children.Add(child);
        }

        public void RemoveChild(UIElement child)
        {
            this.Children.Remove(child);
        }

        #endregion
    }

Работает нормально, ожидается, что во время вызова AddChild все мои дети не полностью инициализированы. Каждый экземпляр создан и не является нулевым, но все свойства зависимостей не инициализируются (у меня такое же поведение с собственными элементами управления фреймворка). Ниже вы можете увидеть соответствующий пример xaml с нативными элементами управления.

<Window x:Class="ProtoPanel.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:ProtoPanel"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <local:MyPanel>
            <Rectangle Fill="Aqua"
                       Width="200"
                       Height="100"/>
            <Ellipse Fill="Bisque" 
                     Canvas.Left="300"
                     Canvas.Top="150"
                     Height="100"
                     Width="100"></Ellipse>
        </local:MyPanel>
    </Grid>
</Window>

Я установил несколько точек останова в своих пользовательских ContentControls и увидел, что все свойства зависимостей (Fill, Width, Heigth, ...) инициализируются значениями xaml после добавления дочернего элемента в Canvas.

Кто-нибудь знает, есть ли способ / хитрость инициализации этих свойств dep при вызове AddChild?

Заранее спасибо

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