WPF kaynağını tanımlama ve bunlara başvurma (WPF .NET)
Bu örnekte bir kaynağı tanımlama ve buna başvurma gösterilmektedir. Bir kaynağa XAML veya kod aracılığıyla başvurulabilir.
XAML örneği
Aşağıdaki örnek iki kaynak türünü tanımlar: bir SolidColorBrush kaynak ve birkaç Style kaynak.
<Window.Resources>
<SolidColorBrush x:Key="MyBrush" Color="#05E0E9"/>
<Style TargetType="Border">
<Setter Property="Background" Value="#4E1A3D" />
<Setter Property="BorderThickness" Value="5" />
<Setter Property="BorderBrush">
<Setter.Value>
<LinearGradientBrush>
<GradientStop Offset="0.0" Color="#4E1A3D"/>
<GradientStop Offset="1.0" Color="Salmon"/>
</LinearGradientBrush>
</Setter.Value>
</Setter>
</Style>
<Style TargetType="TextBlock" x:Key="TitleText">
<Setter Property="FontSize" Value="18"/>
<Setter Property="Foreground" Value="#4E87D4"/>
<Setter Property="FontFamily" Value="Trebuchet MS"/>
<Setter Property="Margin" Value="0,10,10,10"/>
</Style>
<Style TargetType="TextBlock" x:Key="Label">
<Setter Property="HorizontalAlignment" Value="Right"/>
<Setter Property="FontSize" Value="13"/>
<Setter Property="Foreground" Value="{StaticResource MyBrush}"/>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="Margin" Value="0,3,10,0"/>
</Style>
</Window.Resources>
Kaynaklar
Kaynak SolidColorBrush MyBrush
, her biri bir Brush tür değeri alan çeşitli özelliklerin değerini sağlamak için kullanılır. Bu kaynağa değer üzerinden başvurulur x:Key
.
<Border>
<StackPanel>
<TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
<TextBlock Style="{StaticResource Label}">Label</TextBlock>
<TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
<Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
<Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
</StackPanel>
</Border>
Önceki örnekte, MyBrush
kaynağa StaticResource Biçimlendirme Uzantısı ile erişilir. Kaynak, tanımlanan kaynak türünü kabul eden bir özelliğe atanır. Bu durumda Background, Foregroundve Fill özellikleri.
Kaynak diksiyondaki tüm kaynakların bir anahtar sağlaması gerekir. Ancak stiller tanımlandığında, sonraki bölümde açıklandığı gibi anahtarı atlayabilirler.
Başka bir kaynağın içinden bunlara başvurmak için StaticResource İşaretlemesi Uzantısını kullanırsanız, kaynaklar sözlükte bulunan sırayla da istenir. Başvurduğunuz herhangi bir kaynağın, bu kaynağın istendiği yerden önceki koleksiyonda tanımlandığından emin olun. Daha fazla bilgi için bkz . Statik kaynaklar.
Gerekirse, çalışma zamanında kaynağa başvurmak için bir DynamicResource Biçimlendirme Uzantısı kullanarak kaynak başvurularının katı oluşturma sırasına geçici bir çözüm bulabilirsiniz, ancak bu DynamicResource
tekniğin performans sonuçlarına neden olduğunu bilmeniz gerekir. Daha fazla bilgi için bkz . Dinamik kaynaklar.
Stil kaynakları
Aşağıdaki örnek, stillere örtük ve açıkça başvurur:
<Border>
<StackPanel>
<TextBlock Style="{StaticResource TitleText}">Title</TextBlock>
<TextBlock Style="{StaticResource Label}">Label</TextBlock>
<TextBlock HorizontalAlignment="Right" FontSize="36" Foreground="{StaticResource MyBrush}" Text="Text" Margin="20" />
<Button HorizontalAlignment="Left" Height="30" Background="{StaticResource MyBrush}" Margin="40">Button</Button>
<Ellipse HorizontalAlignment="Center" Width="100" Height="100" Fill="{StaticResource MyBrush}" Margin="10" />
</StackPanel>
</Border>
Önceki kod örneğindeStyle, ve Label
kaynakları TitleText
belirli bir denetim türünü hedefler. Bu durumda ikisi de hedefledikleri bir TextBlock. Stiller, özellik için Style kaynak anahtarı tarafından bu stil kaynağına başvurulduğunda hedeflenen denetimlerde çeşitli farklı özellikler ayarlar.
Denetimi hedefleyen Border stil bir anahtar tanımlamaz. Bir anahtar atlandığında, özelliği tarafından TargetType hedeflenen nesne türü örtük olarak stil için anahtar olarak kullanılır. Stil bir türe anahtarlandığında, bu denetimler stilin kapsamı içinde olduğu sürece bu türdeki tüm denetimler için varsayılan stil olur. Daha fazla bilgi için bkz . Stiller, DataTemplates ve örtük anahtarlar.
Kod örnekleri
Aşağıdaki kod parçacıkları, kod aracılığıyla kaynak oluşturmayı ve ayarlamayı gösterir
Stil kaynağı oluşturma
Kaynak oluşturma ve bunu bir kaynak sözlüğüne atama istediğiniz zaman gerçekleşebilir. Ancak, yalnızca DynamicResource söz dizimini kullanan XAML öğeleri oluşturulduktan sonra kaynakla otomatik olarak güncelleştirilir.
Örneğin aşağıdaki Pencere'yi alın. Dört düğmesi vardır. İleri düğmesi, kendi stilini oluşturmak için DynamicResource kullanıyor. Ancak bu kaynak henüz mevcut olmadığından normal bir düğme gibi görünür:
<StackPanel Margin="5">
<Button Click="Button_Click">Explicitly Styled</Button>
<Button>Unstyled</Button>
<Button>Unstyled</Button>
<Button Style="{DynamicResource ResourceKey=buttonStyle1}">Dynamically Styled</Button>
</StackPanel>
İlk düğmeye tıklandığında ve aşağıdaki görevleri gerçekleştirdiğinde aşağıdaki kod çağrılır:
- Kolay başvuru için bazı renkler oluşturur.
- Yeni bir stil oluşturur.
- Stile ayarlayıcılar atar.
- Stili, pencerenin kaynak sözlüğüne adlı
buttonStyle1
bir kaynak olarak ekler. - Stili doğrudan olayı yükselten düğmeye
Click
atar.
private void Button_Click(object sender, RoutedEventArgs e)
{
// Create colors
Color purple = (Color)ColorConverter.ConvertFromString("#4E1A3D");
Color white = Colors.White;
Color salmon = Colors.Salmon;
// Create a new style for a button
var buttonStyle = new Style(typeof(Button));
// Set the properties of the style
buttonStyle.Setters.Add(new Setter(Control.BackgroundProperty, new SolidColorBrush(purple)));
buttonStyle.Setters.Add(new Setter(Control.ForegroundProperty, new SolidColorBrush(white)));
buttonStyle.Setters.Add(new Setter(Control.BorderBrushProperty, new LinearGradientBrush(purple, salmon, 45d)));
buttonStyle.Setters.Add(new Setter(Control.BorderThicknessProperty, new Thickness(5)));
// Set this style as a resource. Any DynamicResource tied to this key will be updated.
this.Resources["buttonStyle1"] = buttonStyle;
// Set this style directly to a button
((Button)sender).Style = buttonStyle;
}
Private Sub Button_Click(sender As Object, e As RoutedEventArgs)
'Create colors
Dim purple = DirectCast(ColorConverter.ConvertFromString("#4E1A3D"), Color)
Dim white = Colors.White
Dim salmon = Colors.Salmon
'Create a new style for a button
Dim buttonStyle As New Style()
'Set the properties of the style
buttonStyle.Setters.Add(New Setter(Control.BackgroundProperty, New SolidColorBrush(purple)))
buttonStyle.Setters.Add(New Setter(Control.ForegroundProperty, New SolidColorBrush(white)))
buttonStyle.Setters.Add(New Setter(Control.BorderBrushProperty, New LinearGradientBrush(purple, salmon, 45D)))
buttonStyle.Setters.Add(New Setter(Control.BorderThicknessProperty, New Thickness(5)))
'Set this style as a resource. Any DynamicResource looking for this key will be updated.
Me.Resources("buttonStyle1") = buttonStyle
'Set this style directly to a button
DirectCast(sender, Button).Style = buttonStyle
End Sub
Kod çalıştırıldıktan sonra pencere güncelleştirilir:
İleri düğmesinin stilinin güncelleştirilmiş olduğuna dikkat edin. Düğme henüz var olmayan bir stile başvurmak için DynamicResource biçimlendirme uzantısını kullandığından stil otomatik olarak uygulandı. Stil oluşturulduktan ve pencerenin kaynaklarına eklendikten sonra düğmeye uygulanır. Daha fazla bilgi için bkz . Dinamik kaynaklar.
Kaynak bulma
Aşağıdaki kod, belirtilen kaynağı bulmak için çalıştırılan XAML nesnesinin mantıksal ağacından geçiş yapar. Kaynak nesnenin kendisinde, üst öğede, köke kadar uygulamanın kendisinde tanımlanabilir. Aşağıdaki kod, düğmenin kendisinden başlayarak bir kaynağı arar:
myButton.Style = myButton.TryFindResource("buttonStyle1") as Style;
myButton.Style = myButton.TryFindResource("buttonStyle1")
Bir kaynağa açıkça başvurma
Bir kaynağa başvurunuz olduğunda, kaynağı arayarak veya oluşturarak doğrudan bir özelliğe atanabilir:
// Set this style as a resource. Any DynamicResource tied to this key will be updated.
this.Resources["buttonStyle1"] = buttonStyle;
'Set this style as a resource. Any DynamicResource looking for this key will be updated.
Me.Resources("buttonStyle1") = buttonStyle
Ayrıca bkz.
.NET Desktop feedback