0

StackPanel在 WPF 中使用只是为了轻松布局水平对齐的框和线,但使用StackPanel.

所有的微软教程似乎只谈论冻结一些SolidColorBrush等对象,但 StackPanel 是否可以在第一次布局后被冻结,这样 CPU 就不必一直布局它,只需一次?

还是我只是被迫使用非常快Canvas的对象并将其中的所有对象一一布局?

示例 1:在设计器中非常容易布局,但缺乏性能:

    <StackPanel Height="35" Canvas.Left="49" Canvas.Top="874" Width="395" Orientation="Horizontal">
        <TextBox Text="test" Width="65"/>
        <Rectangle Stroke="Black" Width="1" />
        <TextBox Text="test" Width="55"/>
        <Rectangle Stroke="Black" Width="1" />
        <TextBox Text="test" Width="75"/>
        <Rectangle Stroke="Black" Width="1" />
        <TextBox Text="test" Width="35"/>
        <Rectangle Stroke="Black" Width="1" />
        <TextBox Text="test" Width="95"/>
        <Rectangle Stroke="Black" Width="1" />
        <TextBox Text="test" Width="65"/>
        <Rectangle Stroke="Black" Width="1" />
    </StackPanel>

示例 2:良好的性能,在设计器中进行布局很痛苦:

    <Canvas Height="35"  Canvas.Left="49" Canvas.Top="914" Width="395">
        <TextBox Text="test" Width="65" Height="35"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="65"/>
        <TextBox Text="test" Width="55" Canvas.Left="66" Height="35"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="195"/>
        <TextBox Text="test" Width="75" Height="35" Canvas.Left="122"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="121"/>
        <TextBox Text="test" Width="35" Height="35" Canvas.Left="198"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="197"/>
        <TextBox Text="test" Width="95" Height="35" Canvas.Left="234"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="329"/>
        <TextBox Text="test" Width="65" Height="35" Canvas.Left="330"/>
        <Rectangle Stroke="Black" Width="1" Height="35" Canvas.Left="233"/>         
    </Canvas>
4

1 回答 1

1

不,StackPanel不是Freezable,但是您提到您在渲染时GPU遇到问题,请尝试删除fpsAnimations60fpsAnimation

在您的主要 Windows 构造函数中,您可以覆盖默认framerateAnimations

我通常使用 30fps,因为它仍然很流畅,使用低端GFX显卡的用户将能够更流畅地运行您的应用程序。

例子:

    public MainWindow() 
    {
        InitializeComponent();

        Timeline.DesiredFrameRateProperty.OverrideMetadata(typeof(Timeline)
           , new FrameworkPropertyMetadata { DefaultValue = 30 }); // 30 = 30fps
    }

试试看是否有帮助

于 2013-03-08T22:04:00.553 回答