Denetim için stil oluşturma (WPF .NET)

Windows Presentation Foundation (WPF) ile mevcut bir denetimin görünümünü kendi yeniden kullanılabilir stilinizle özelleştirebilirsiniz. Stiller uygulamanıza, pencerelerinize ve sayfalarınıza genel olarak veya doğrudan denetimlere uygulanabilir.

Stil oluşturma

bir Style veya daha fazla öğeye özellik değerleri kümesi uygulamak için uygun bir yol olarak düşünebilirsiniz. veya gibi Window bir öğesinden FrameworkElement FrameworkContentElement türetilen herhangi bir Buttonöğede stil kullanabilirsiniz.

Stil bildirmenin en yaygın yolu, XAML dosyasının Resources bölümündeki bir kaynaktır. Stiller kaynak olduğundan, tüm kaynaklar için geçerli olan aynı kapsam kurallarına uyarlar. Basitçe ifade edin, bir stili bildirdiğiniz yer, stilin uygulanabileceği yeri etkiler. Örneğin, stili uygulama tanımı XAML dosyanızın kök öğesinde bildirirseniz, stil uygulamanızın herhangi bir yerinde kullanılabilir.

<Application x:Class="IntroToStylingAndTemplating.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:IntroToStylingAndTemplating"
             StartupUri="WindowExplicitStyle.xaml">
    <Application.Resources>
        <ResourceDictionary>
            
            <Style x:Key="Header1" TargetType="TextBlock">
                <Setter Property="FontSize" Value="15" />
                <Setter Property="FontWeight" Value="ExtraBold" />
            </Style>
            
        </ResourceDictionary>
    </Application.Resources>
</Application>

Stili uygulamanın XAML dosyalarından birinde bildirirseniz, stil yalnızca bu XAML dosyasında kullanılabilir. Kaynaklar için kapsam belirleme kuralları hakkında daha fazla bilgi için bkz . XAML kaynaklarına genel bakış.

<Window x:Class="IntroToStylingAndTemplating.WindowSingleResource"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:IntroToStylingAndTemplating"
        mc:Ignorable="d"
        Title="WindowSingleResource" Height="450" Width="800">
    <Window.Resources>
        
        <Style x:Key="Header1" TargetType="TextBlock">
            <Setter Property="FontSize" Value="15" />
            <Setter Property="FontWeight" Value="ExtraBold" />
        </Style>
        
    </Window.Resources>
    <Grid />
</Window>

Stil, stilin <Setter> uygulandığı öğelerde özellikleri ayarlayan alt öğelerden oluşur. Yukarıdaki örnekte, stilin özniteliği aracılığıyla türlere TextBlock uygulanacak şekilde ayarlandığına TargetType dikkat edin. Stil olarak ve FontWeight olarak ayarlanır FontSize 15.ExtraBold Stilin değiştiği her özellik için bir <Setter> ekleyin.

Stili örtük olarak uygulama

A Style , bir özellik değerleri kümesini birden çok öğeye uygulamanın kullanışlı bir yoludur. Örneğin, bir pencerede aşağıdaki TextBlock öğeleri ve bunların varsayılan görünümünü göz önünde bulundurun.

<StackPanel>
    <TextBlock>My Pictures</TextBlock>
    <TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

Önce stil oluşturma örneği ekran görüntüsü

Her TextBlock öğede ve gibi FontSize FontFamilyözellikleri doğrudan ayarlayarak varsayılan görünümü değiştirebilirsiniz. Ancak, öğelerinizin TextBlock bazı özellikleri paylaşmasını istiyorsanız, burada gösterildiği gibi XAML dosyanızın bölümünde bir Resources Style oluşturabilirsiniz.

<Window.Resources>
    <!--A Style that affects all TextBlocks-->
    <Style TargetType="TextBlock">
        <Setter Property="HorizontalAlignment" Value="Center" />
        <Setter Property="FontFamily" Value="Comic Sans MS"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
</Window.Resources>

Stilinizin TextBlock türünü ayarladığınızda TargetType ve özniteliğini x:Key atladığınızda, stil genellikle XAML dosyasının TextBlock kendisi olan stil kapsamındaki tüm öğelere uygulanır.

TextBlock Artık öğeler aşağıdaki gibi görünür.

Stil oluşturma örneği ekran görüntüsü temel stili

Stili açıkça uygulama

Stile değer içeren bir x:Key öznitelik eklerseniz, stil artık tüm öğelerine TargetTypeörtük olarak uygulanmaz. Yalnızca stile açıkça başvuran öğelere stil uygulanır.

Önceki bölümdeki stil aşağıdadır, ancak özniteliğiyle x:Key bildirilir.

<Window.Resources>
    <Style x:Key="TitleText" TargetType="TextBlock">
        <Setter Property="HorizontalAlignment" Value="Center" />
        <Setter Property="FontFamily" Value="Comic Sans MS"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
</Window.Resources>

Stili uygulamak için, burada gösterildiği gibi staticResource işaretleme uzantısını kullanarak öğesindeki x:Key özelliğini değerine ayarlayınStyle.

<StackPanel>
    <TextBlock Style="{StaticResource TitleText}">My Pictures</TextBlock>
    <TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

İkinci TextBlock öğesi değişmeden kalırken, ilk TextBlock öğenin stiline uygulandığına dikkat edin. Önceki bölümdeki örtük stil özniteliğini belirten x:Key bir stile değiştirildi, yani stilden etkilenen tek öğe, stile doğrudan başvuran stildir.

Stil oluşturma örneği ekran görüntüsü metin bloğu

Stil açıkça veya örtük olarak uygulandıktan sonra korumalı hale gelir ve değiştirilemez. Uygulanmış bir stili değiştirmek istiyorsanız, varolan stili değiştirmek için yeni bir stil oluşturun. Daha fazla bilgi için özelliğine IsSealed bakın.

Özel mantığa göre uygulanacak stili seçen bir nesne oluşturabilirsiniz. Bir örnek için, sınıf için sağlanan örne StyleSelector bakın.

Program aracılığıyla stil uygulama

Adlandırılmış stili bir öğeye program aracılığıyla atamak için, resources koleksiyonundan stili alın ve öğenin Style özelliğine atayın. Kaynak koleksiyonundaki öğeler türündedir Object. Bu nedenle, özelliğine atamadan Style önce alınan stili olarak System.Windows.Style atamanız gerekir. Örneğin, aşağıdaki kod adlandırılmış textblock1 bir TextBlock öğesinin stilini tanımlı stile TitleTextayarlar.

textblock1.Style = (Style)Resources["TitleText"];
textblock1.Style = CType(Resources("TitleText"), Windows.Style)

Stili genişletme

İki öğenizin TextBlock ve ortalanmış HorizontalAlignmentgibi FontFamily bazı özellik değerlerini paylaşmasını isteyebilirsiniz. Ancak Resimlerim metninin bazı ek özelliklere sahip olmasını da istiyorsunuz. Burada gösterildiği gibi, ilk stili temel alan yeni bir stil oluşturarak bunu yapabilirsiniz.

<Window.Resources>
    <!-- .... other resources .... -->

    <!--A Style that affects all TextBlocks-->
    <Style TargetType="TextBlock">
        <Setter Property="HorizontalAlignment" Value="Center" />
        <Setter Property="FontFamily" Value="Comic Sans MS"/>
        <Setter Property="FontSize" Value="14"/>
    </Style>
    
    <!--A Style that extends the previous TextBlock Style with an x:Key of TitleText-->
    <Style BasedOn="{StaticResource {x:Type TextBlock}}"
           TargetType="TextBlock"
           x:Key="TitleText">
        <Setter Property="FontSize" Value="26"/>
        <Setter Property="Foreground">
            <Setter.Value>
                <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
                    <LinearGradientBrush.GradientStops>
                        <GradientStop Offset="0.0" Color="#90DDDD" />
                        <GradientStop Offset="1.0" Color="#5BFFFF" />
                    </LinearGradientBrush.GradientStops>
                </LinearGradientBrush>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

Ardından, stili öğesine TextBlockuygulayın.

<StackPanel>
    <TextBlock Style="{StaticResource TitleText}" Name="textblock1">My Pictures</TextBlock>
    <TextBlock>Check out my new pictures!</TextBlock>
</StackPanel>

Bu TextBlock stil artık ortalanmış, boyutu 26ve ön plan rengi örnekte gösterilene ayarlanmış LinearGradientBrush bir yazı tipi kullanıyorComic Sans MS. Temel stilin FontSize değerini geçersiz kıldığını fark edin. içinde aynı özelliğe StyleSetter işaret eden birden Setter fazla öğe varsa, en son bildirilen öncelik kazanır.

Aşağıda öğelerin artık nasıl TextBlock göründüğü gösterilmektedir:

StilLi TextBlocks

Bu TitleText stil, türü için TextBlock oluşturulan ve ile BasedOn="{StaticResource {x:Type TextBlock}}"başvuruda bulunan stili genişletir. Ayrıca, öğesini içeren x:Key bir stili, stilini kullanarak x:Key da genişletebilirsiniz. Örneğin, adlı Header1 bir stil varsa ve bu stili genişletmek istiyorsanız kullanabilirsiniz BasedOn="{StaticResource Header1}".

TargetType özelliğinin ve x:Key özniteliğinin ilişkisi

Daha önce gösterildiği gibi, stili atamadan özelliğini olarak ayarlamakTargetType, stilin x:Key tüm TextBlock öğelere uygulanmasına neden olur.TextBlock Bu durumda, x:Key örtük olarak olarak {x:Type TextBlock}ayarlanır. Bu, değeri dışında {x:Type TextBlock}bir değere açıkça ayarlarsanız öğesinin x:Key Style tüm TextBlock öğelere otomatik olarak uygulanmayacağı anlamına gelir. Bunun yerine, stili (değerini kullanarak x:Key ) öğelere TextBlock açıkça uygulamanız gerekir. Stiliniz kaynaklar bölümündeyse ve stilinizde özelliğini ayarlamazsanız TargetType özniteliğini x:Key ayarlamanız gerekir.

özelliği için x:KeyTargetType varsayılan bir değer sağlamaya ek olarak, ayarlayıcı özelliklerinin uygulanacağı türü belirtir. belirtmezsenizTargetType, söz dizimini Property="ClassName.Property"kullanarak nesnelerinizdeki Setter özellikleri sınıf adıyla nitelemeniz gerekir. Örneğin, ayarı Property="FontSize"yerine veya "Control.FontSize"olarak ayarlamanız Property "TextBlock.FontSize" gerekir.

Ayrıca, birçok WPF denetiminin diğer WPF denetimlerinin birleşiminden oluştuğuna dikkat edin. Bir türün tüm denetimleri için geçerli olan bir stil oluşturursanız beklenmeyen sonuçlar alabilirsiniz. Örneğin, içinde türünü hedefleyen TextBlock bir Windowstil oluşturursanız, stili gibi başka bir denetimin parçası olsa TextBlock bile penceredeki tüm TextBlock denetimlere ListBoxuygulanır.

Ayrıca bkz.