Performance von WPF-Anwendungen

Noxxxon

Grünschnabel
Hi!

Ich habe heute mal ein kleines Test-Programm geschrieben um mich an WPF zu gewöhnen. Es ist nichts weiter tragisches, da es lediglich zwei Button, ein Label und eine selbstgebastelte, analoge Uhr hat. Die Buttons habe ich mit RadialGradient von einem Grau/Schwarz-Verlauf bearbeitet. Die Uhr aktualisiert sich natürlich im Sekundentakt.

Wenn ich nun meine Anwendung von den ursprünglichen 300x300 Px manuell vergrößere und dann noch mal die Buttons betätige, ändert sich der Text im Label nur seeehr langsam.

Liegt an meiner (Arbeitsplatz-)Workstation? Habe ihn eine 3,2 Ghz, 3,5 GB Ram und eine FX 5200 mit 128 MB. Kann doch eigentlich nicht, oder?

Gibt es noch Einstellungsmöglichkeiten um die Anwendung zu beschleunigen? Das Microsoft-Tool (WPF Performance Suite) habe ich schon installiert und mein kleines Programm gestartet. Wenn ich hierbei das Fenster größer ziehe, geht die Auslastung der CPU bis auf 60% hoch! Das ist doch nicht normal?!

Code:
<Window x:Class="test2.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="600" Width="600" xmlns:my="clr-namespace:System.Windows.Forms.Integration;assembly=WindowsFormsIntegration"
    Background="#FF2D2D2D"
    ResizeMode="CanResize"
    WindowStyle="SingleBorderWindow" Topmost="False">
    <Window.BitmapEffect>
        <DropShadowBitmapEffect />
    </Window.BitmapEffect>
    <Window.Resources>
        <Style x:Key="ButtonStyle2" BasedOn="{x:Null}" TargetType="{x:Type Button}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type Button}">
                        <Grid>
                            <Rectangle Stroke="#FF868686" RadiusX="3.5" RadiusY="3.5" x:Name="rectangle">
                                <Rectangle.Fill>
                                    <LinearGradientBrush EndPoint="0.5,1.069" StartPoint="0.5,-0.069">
                                        <GradientStop Color="#FF151515" Offset="0"/>
                                        <GradientStop Color="#FF4D4D4D" Offset="0.996"/>
                                        <GradientStop Color="#FF2E2E2E" Offset="0.451"/>
                                        <GradientStop Color="#FF3A3A3A" Offset="0.477"/>
                                    </LinearGradientBrush>
                                </Rectangle.Fill>
                            </Rectangle>
                            <ContentPresenter SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="-15,0,0,0" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/>
                            <Path Fill="#FFF0F0F0" Stretch="Fill" Stroke="{x:Null}" HorizontalAlignment="Right" Margin="0,9.4,12.614,8.708" Width="8.995" Data="M77.948291,10.204871 L77.948291,18.330085 84.484179,14.444162 z"/>
                        </Grid>
                        <ControlTemplate.Triggers>
                            <Trigger Property="IsFocused" Value="True"/>
                            <Trigger Property="IsDefaulted" Value="True"/>
                            <Trigger Property="IsMouseOver" Value="True">
                                <Setter Property="Stroke" TargetName="rectangle" Value="#FFD4D4D4"/>
                            </Trigger>
                            <Trigger Property="IsPressed" Value="True"/>
                            <Trigger Property="IsEnabled" Value="False"/>
                        </ControlTemplate.Triggers>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </Window.Resources>
    <Grid>
        <Button Style="{DynamicResource ButtonStyle2}" Height="32" Margin="0,0,46,26" Name="button1" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="75" Click="button1_Click">Button</Button>
        <Image Source="http://www.tutorials.de/forum/images/backGround.png" Height="150" Width="150" HorizontalAlignment="Left" Margin="20,22,0,0" VerticalAlignment="Top"/>
        <!-- <Label Name="Logo" Foreground="White" Margin="56,82,0,0" VerticalAlignment="Top" Height="3" HorizontalAlignment="Left" Width="32">advertizR</Label>-->
        
        <!-- Second  -->
        <Rectangle Margin="93,38.5,0,0" Name="rectangleSecond" Stroke="White" Height="60" VerticalAlignment="Top" HorizontalAlignment="Left">
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="secondHand" CenterX="0" CenterY="60" Angle="0" />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!-- -->
        
        <!-- Minute  -->
        <Rectangle Margin="93,52,0,0" Name="rectangleMinute" Stroke="LightGreen" HorizontalAlignment="Left" Width="0.5" Height="45" VerticalAlignment="Top">
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="minuteHand" CenterX="0" CenterY="50" Angle="0" />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!-- -->
        
        <!-- Hour  -->
        <Rectangle Margin="93,60,0,0" Name="rectangleHour" Stroke="LightYellow" HorizontalAlignment="Left" Width="0.5" Height="37" VerticalAlignment="Top">
            <Rectangle.RenderTransform>
                <RotateTransform x:Name="hourHand" CenterX="0" CenterY="35" Angle="0" />
            </Rectangle.RenderTransform>
        </Rectangle>
        <!-- -->

        <Label Height="28" Margin="20,0,0,45" Name="label1" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="50" Foreground="White">Label</Label>
        <Button Style="{DynamicResource ButtonStyle2}"  Height="32" Margin="0,0,46,100" HorizontalAlignment="Right" Name="button2" VerticalAlignment="Bottom" Width="75" Click="button2_Click">Button</Button>
        
        
    </Grid>
</Window>

Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.Threading;
using System.Windows.Threading;
using System.Windows.Media.Animation;

namespace test2
{
    public partial class Window1 : Window
    {
        System.Timers.Timer timer = new System.Timers.Timer(1000);
        int renderingTier = (RenderCapability.Tier >> 0);

        public Window1()
        {
            InitializeComponent();
                        
            DateTime date = DateTime.Now;
            TimeZone time = TimeZone.CurrentTimeZone;
            TimeSpan difference = time.GetUtcOffset(date);

            timer.Elapsed += new System.Timers.ElapsedEventHandler(timer_Elapsed);
            timer.Enabled = true;
        }

        void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            this.Dispatcher.Invoke(DispatcherPriority.Normal, (Action)(() =>
            {
                secondHand.Angle = DateTime.Now.Second * 6;
                minuteHand.Angle = DateTime.Now.Minute * 6;
                hourHand.Angle = (DateTime.Now.Hour * 30) + (DateTime.Now.Minute * 0.5);
            }));
        }

        private void button1_Click(object sender, RoutedEventArgs e)
        {
            label1.Content = "Test";
        }

        private void button2_Click(object sender, RoutedEventArgs e)
        {
                label1.Content = "Label";
        }
    }
}


Danke!

Edit: Ich habe gerade noch mal Dr. Google befragt und etwas über die RenderingTiers gefunden, so dass diese von 0 bis 2 geändert werden können. Jedoch merke ich bei meinem Programm keinen Unterschied, oder aber ich hab es falsch eingetragen.


EDIT2: Das Problem hat sich erledigt, in dem ich <Window.BitmapEffect><DropShadowBitmapEffect /></Window.BitmapEffect> ausgeklammert habe. Dies hat scheinbar zu starken Performanceproblemen geführt.
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück