gpt4 book ai didi

wpf - WPF中的绑定(bind)和布局关系

转载 作者:行者123 更新时间:2023-12-04 08:46:35 27 4
gpt4 key购买 nike

在调查我正在处理的应用程序问题时,我遇到了一种我不太了解的行为。似乎当您有一个带有绑定(bind) Text 属性的 TextBox(例如)时,系统会比拥有静态 Text 时多进行一次布局传递。

请任何人解释为什么会发生这种额外的通行证?引擎是否先放置未绑定(bind)的控件,然后绑定(bind)它,然后再放置它?

为了测试这一点,我构建了这样的测试用例:

我已经声明了一个继承自 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 属性更改为这样绑定(bind):
    <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。为什么这个额外的通行证是必要的?

最佳答案

Does the engine lay the unboundcontrol first then binds it and thenlays it once again?


可能确实是这样——
WPF data binding大量建立在 Dependency Properties 之上,实际上确实会影响 WPF 布局过程,请参阅 Layout Performance Considerations :

Dependency properties whose values cancause the layout system to beinitialized are marked with publicflags. AffectsMeasure andAffectsArrange provide useful clues asto which property value changes willforce a recursive update by the layoutsystem. In general, any property thatcan affect the size of an element'sbounding box should set theAffectsMeasure flag to true. For moreinformation, please see DependencyProperties Overview.


特别是关于您的问题,请参阅 Optimizing Performance: Layout and Design 中的此引文:

The layout pass process is invoked again if any of the following actions occur:

  • [...]
  • When a change occurs to the value of a dependency property that ismarked with metadata affecting the measure or arrange passes.

因此,我可以想象初始布局传递与稍后更改绑定(bind)值的用例没有任何不同,这将解释您所遇到的行为。虽然这可能仍然是优化启动体验的错失机会,但通常的优化警告适用:没有测量就没有优化 - 例如这种假定的冗余(如果在技术上完全可以避免)可能没有可衡量的影响,因为尚未显示窗口/控件等。

调试:
添加德鲁斯 suggestion of a debugging aid , .NET Framework 3.5 中引入了与绑定(bind)相关的新的专用调试辅助工具,请参阅 PresentationTraceSources.TraceLevel - 例子:
<Window ... xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase">
<local:MultiBoundTextBox x:Name="tb">
<Binding Path="Day" Mode="OneWay"
diag:PresentationTraceSources.TraceLevel="High"/>
</local:MultiBoundTextBox>
</Window>
不过,这有一些限制,请务必阅读 PresentationTraceSources Class 中的备注部分。 .

关于wpf - WPF中的绑定(bind)和布局关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/734519/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com