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.

Önemli

.NET 7 ve .NET 6 için Masaüstü Kılavuzu belgeleri yapım aşamasındadır.

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 SolidColorBrushMyBrush , 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 Labelkaynakları 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>

A window before a style is applied to a button

İ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:

A window after a style is applied to a button

İ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.