【发布时间】:2010-10-18 14:00:55
【问题描述】:
在调查我正在处理的应用程序的问题时,我遇到了一种我不太了解的行为。似乎当您有一个带有绑定 Text 属性的 TextBox(例如)时,系统会比您拥有静态 Text 时多进行一次布局传递。
谁能解释一下为什么会发生这种额外的通行证?引擎是先放置未绑定的控件,然后绑定,再放置一次吗?
为了测试这一点,我构建了这样的测试用例:
我已经声明了一个继承自 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
但如果我将 Text 属性更改为这样绑定:
<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 详细复制案例。