Изучая проблему с приложением, над которым я работаю, я столкнулся с одним поведением, которое я не совсем понимаю. Кажется, что когда у вас есть TextBox (например) со связанным свойством Text, система принимает еще один макет, чем когда у вас есть статический текст.Отношение привязки и компоновки в WPF
Может ли кто-нибудь объяснить, почему этот дополнительный пропуск происходит? Вначале ли двигатель закладывает несвязанный элемент управления, а затем связывает его, а затем снова кладет его?
Чтобы проверить это, я построил такой тестовый случай:
Я объявил класс, унаследованный от TextBox (так что я могу переопределить ArrangeOverride):
public class MultiBoundTextBox : TextBox
{
protected override Size ArrangeOverride(Size arrangeBounds)
{
Console.WriteLine("TextBox.Arrange");
return base.ArrangeOverride(arrangeBounds);
}
}
Затем я поместил экземпляр этого текстовое поле в окне:
<local:MultiBoundTextBox x:Name="tb">
Some text
</local:MultiBoundTextBox>
И добавил код для окна для тестирования:
public Window11()
{
InitializeComponent();
}
private void Window_Loaded(object sender, RoutedEventArgs e)
{
Console.WriteLine("Window.Loaded");
}
protected override Size ArrangeOverride(Size arrangeBounds)
{
Console.WriteLine("Window.Arrange");
return base.ArrangeOverride(arrangeBounds);
}
private void Window_Initialized(object sender, EventArgs e)
{
Console.WriteLine("Window.Initialized");
tb.DataContext = DateTime.Now;
}
Теперь, когда я запускаю это я получаю этот выход:
Window.Initialized
Window.Arrange
TextBox.Arrange
Window.Arrange
Window.Loaded
Но если я изменить свойства текста, которые будут связаны следующим образом:
<local:MultiBoundTextBox x:Name="tb">
<Binding Path="Day" Mode="OneWay" />
</local:MultiBoundTextBox>
Я получаю это на выходе:
Window.Initialized
Window.Arrange
TextBox.Arrange
Window.Arrange
TextBox.Arrange
Window.Arrange
Window.Loaded
Обратите внимание на дополнительную пару TextBox.Arrange и Window.Arrange. Зачем нужен этот дополнительный проход?
+1 для детального случая воспроизведения. –