【问题标题】:Hierarchical panels vs hardcoded margins performance分层面板与硬编码边距性能
【发布时间】:2015-02-25 13:26:30
【问题描述】:

在设计 WPF 应用程序时,使用多个嵌套面板(因为它们被设计为使用)或硬编码大多数控件的边距并将它们放在一个面板中(例如网格)在性能方面更好? 比如上面的设计,我们可以这样写:

<StackPanel>
                    <TextBlock Text="اطلاعات خود را وارد نمایید:" VerticalAlignment="Top"/>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="1*"/>
                            <ColumnDefinition Width="1*"/>
                        </Grid.ColumnDefinitions>
                        <StackPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="نام: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCFirstName" VerticalAlignment="Top"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="نام خانوادگی: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCLastName" VerticalAlignment="Top"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="تلفن منزل: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCHomeNumber" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="تلفن همراه: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCMobileNumber" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                            </DockPanel>
                        </StackPanel>
                        <StackPanel Grid.Column="1">
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="شرکت: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCCompany" VerticalAlignment="Top"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="سمت: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCTitle" VerticalAlignment="Top"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="تلفن کاری: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCWorkNumber" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                            </DockPanel>
                            <DockPanel LastChildFill="True" Margin="5, 3">
                                <TextBlock Text="وب سایت: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                                <TextBox x:Name="tbVCWebSite" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                            </DockPanel>
                        </StackPanel>
                    </Grid>
                    <DockPanel LastChildFill="True" Margin="5, 3">
                        <TextBlock Text="ایمیل شخصی: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                        <TextBox x:Name="tbVCPersonalEmail" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                    </DockPanel>
                    <DockPanel LastChildFill="True" Margin="5, 3">
                        <TextBlock Text="ایمیل کاری: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                        <TextBox x:Name="tbVCWorkEmail" VerticalAlignment="Top" FlowDirection="LeftToRight"/>
                    </DockPanel>
                    <DockPanel LastChildFill="True" Margin="5, 3">
                        <TextBlock Text="آدرس: " VerticalAlignment="Top" HorizontalAlignment="Left"/>
                        <TextBox x:Name="tbVCAddress" VerticalAlignment="Top"/>
                    </DockPanel>
                </StackPanel>  

或者我们可以将它们全部声明在一个网格中并赋予它们边距。
This article 说“在许多情况下,由于它作为布局容器的灵活性,可以使用 Grid 元素代替嵌套面板。这可以通过将不必要的元素排除在树之外来提高应用程序的性能。”但这对我来说似乎很奇怪!

上述实现中哪一个对运行时渲染性能更好,为什么?

【问题讨论】:

    标签: wpf panel


    【解决方案1】:

    经验法则是,如果需要性能,则不应将元素嵌套在不同的面板中 - 展平通常会很好地工作。

    Margin 会更快,因为它很容易计算元素的最终位置。 DockPanel 需要计算自己的位置,加上它的孩子,这使得它更昂贵。

    http://msdn.microsoft.com/en-us/library/bb613542%28v=vs.110%29.aspx

    【讨论】:

    • 这很不幸,因为它不可维护。如果我们想在中间添加另一个字段,我们将不得不修改所有这些边距。
    • @SepehrM,是的,这是真的。然而,我的真实生活经验表明,您通常可以放松并以可维护的方式创建您的东西,而不必担心性能 - 例如使用DockPanel 路线。确实,如果您有非常复杂的深层 UI(例如,其中嵌套了许多面板),如果您将所有内容展平并摆脱不需要的面板,它将提高性能..
    • 这真是个好消息。我们的控制模板非常复杂,我们已尽最大努力简化它们的结构。但是在设计页面和窗口时,我认为可维护性更重要。如何自己测试渲染速度?
    • @SepehrM:这可以帮助您入门:msdn.microsoft.com/en-us/library/aa969767%28v=vs.110%29.aspx(WPF 性能套件)
    • 我可以在 Windows 8.1 开发机器上将该工具用于 .NET 4.0 吗?
    【解决方案2】:

    定义边距的问题在于,当您尝试调整窗口大小时,您的控件将出现裁剪,因为它必须为边距腾出空间。定义控件的长度和宽度时也是如此。为了使其分辨率更高,嵌套将是一个更好的选择,即使这样在非常低的分辨率下也可能无法提供更好的结果。

    【讨论】:

    • 是的。性能怎么样?系统资源消耗和完全渲染所需的时间。
    • 有些面板可以很容易地省略。例如,当内容是静态的时,堆栈面板不会提供很大的灵活性。在大多数情况下,您可以在没有嵌套堆栈面板的情况下实现相同的行为。
    • 面板确实对性能有一些影响,但这会因面板类型而异。
    猜你喜欢
    • 2023-03-13
    • 2011-04-08
    • 2011-06-05
    • 2019-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    相关资源
    最近更新 更多