分层面板与硬编码边距性能

时间:2014-12-29 10:57:32

标签: wpf panel

在设计WPF应用程序时,使用多个嵌套面板(因为它们被设计用于)或硬编码大多数控件的边距并将它们放在一个面板(例如网格)中是否更好?登记/> Sample UI 例如,为了设计上述内容,我们可以写:

<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元素而不是嵌套面板。这可以通过将不必要的元素保留在树之外来提高应用程序的性能。”但这对我来说似乎很奇怪!

上述哪些实现更适合运行时渲染性能以及为什么?

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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