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>
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.
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 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 TitleText
ayarlar.
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 TextBlock
uygulayı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 26
ve ö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:
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:Key
TargetType
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.
.NET Desktop feedback