Performansı İyileştirme: Uygulama Kaynakları
WPF benzer yazılı öğelerde tutarlı bir görünüm veya davranışı destekleyebilmeniz için uygulama kaynaklarını paylaşmanıza olanak sağlar. Bu konuda, bu alanda uygulamalarınızın performansını artırmanıza yardımcı olabilecek birkaç öneri sunulmaktadır.
Kaynaklar hakkında daha fazla bilgi için bkz. xaml kaynakları.
Kaynakları paylaşma
Uygulamanız özel denetimler kullanıyorsa ve bir ResourceDictionary (ya da xaml kaynakları düğümünde) kaynakları tanımlıyorsa, kaynakları Application veya nesne düzeyinde tanımlamanız ya da Window bunları özel denetimler için varsayılan Temada tanımlamanız önerilir. Özel bir denetimde kaynakların tanımlanması, ResourceDictionary Bu denetimin her örneği için bir performans etkisi getirir. Örneğin, özel bir denetimin kaynak tanımının bir parçası olarak tanımlanan performans yoğunluğu olan fırça işlemleri ve özel denetimin birçok örneği varsa, uygulamanın çalışma kümesi önemli ölçüde artacaktır.
Bu noktayı göstermek için aşağıdakileri göz önünde bulundurun. Kullanarak bir kart oyununuzu geliştirdiğinizi varsayalım WPF . Çoğu kart oyunlarında, 52 farklı yüzlerle 52 kart gerekir. Bir kart özel denetimi uygulamaya karar verirsiniz ve kart özel denetiminizin kaynaklarında 52 fırçalar (her biri bir kart yüzünü temsil eder) tanımlarsınız. Ana uygulamanızda başlangıçta bu kart özel denetiminin 52 örneğini oluşturursunuz. Her bir kart özel denetimi örneği Brush , uygulamanızda toplam 52 * 52 nesnesi sağlayan 52 nesne örneği oluşturur Brush . Bir kart özel denetim kaynağı dışına Application veya Window nesne düzeyine geçiş yaparak veya bunları özel denetim için varsayılan Temada tanımlayarak, artık 52 fırçalarını kart denetiminin 52 örnekleri arasında paylaşmakta olduğunuza göre uygulamanın çalışma kümesini azaltabilirsiniz.
Bir fırçayı kopyalamadan paylaşma
Aynı nesneyi kullanan birden çok öğeye sahipseniz Brush , fırçayı bir kaynak olarak tanımlayın ve xaml 'de fırça satır içi tanımlamak yerine ona başvurun. Bu yöntem bir örnek oluşturacak ve onu yeniden kullanacaktır, ancak XAML 'de fırça satır içi tanımlamak her öğe için yeni bir örnek oluşturur.
Aşağıdaki biçimlendirme örneği bu noktayı gösterir:
<StackPanel.Resources>
<LinearGradientBrush x:Key="myBrush" StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</StackPanel.Resources>
<!-- Non-shared Brush object. -->
<Label>
Label 1
<Label.Background>
<LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5" Opacity="0.5">
<LinearGradientBrush.GradientStops>
<GradientStopCollection>
<GradientStop Color="GoldenRod" Offset="0" />
<GradientStop Color="White" Offset="1" />
</GradientStopCollection>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Label.Background>
</Label>
<!-- Shared Brush object. -->
<Label Background="{StaticResource myBrush}">Label 2</Label>
<Label Background="{StaticResource myBrush}">Label 3</Label>
Mümkün olduğunda statik kaynakları kullan
Statik bir kaynak, önceden tanımlanmış bir kaynağa bir başvuru arayarak herhangi bir XAML özellik özniteliği için bir değer sağlar. Bu kaynak için arama davranışı, derleme zamanı aramasına benzer.
Diğer yandan dinamik bir kaynak, ilk derleme sırasında geçici bir ifade oluşturur ve bu nedenle istenen kaynak değeri gerçekten bir nesne oluşturmak için gerekene kadar kaynakları aramayı erteler. Bu kaynağın arama davranışı, bir performans etkisi sağlayan çalışma zamanı aramasına benzer. Uygulamanızda mümkün olduğunda statik kaynakları, yalnızca gerektiğinde dinamik kaynakları kullanarak kullanın.
Aşağıdaki biçimlendirme örneği her iki tür kaynak kullanımını gösterir:
<StackPanel.Resources>
<SolidColorBrush x:Key="myBrush" Color="Teal"/>
</StackPanel.Resources>
<!-- StaticResource reference -->
<Label Foreground="{StaticResource myBrush}">Label 1</Label>
<!-- DynamicResource reference -->
<Label Foreground="{DynamicResource {x:Static SystemColors.ControlBrushKey}}">Label 2</Label>