В настоящее время я работаю над пользовательской реализацией 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?
Заранее спасибо