2017-09-14 39 views
1

我想設置Shape.Stroke屬性使用WPF中的樣式的幾種形狀類型。無法設置樣式與TargetType形狀

<Style.Resources> 
    <Style TargetType="{x:Type Polyline}"> 
    <Setter Property="Stroke" Value="White"/> 
    </Style> 
    <Style TargetType="{x:Type Path}"> 
    <Setter Property="Stroke" Value="White"/> 
    </Style> 
    <Style TargetType="{x:Type Ellipse}"> 
    <Setter Property="Stroke" Value="White"/> 
    </Style> 
    ... 
</Style.Resources> 

似乎不可能爲基類Shape設置樣式。

<Style.Resources> 
    <Style TargetType="{x:Type Shape}"> 
    <Setter Property="Stroke" Value="White"/> 
    </Style> 
</Style.Resources> 

沒有比我列出的第一個選項更好的方法嗎?

回答

2

當WPF搜索隱含的Style時,它會查找其關鍵字與要被樣式化的元素的DefaultStyleKey相匹配的資源。 WPF中的約定是每個控件T都會覆蓋DefaultStyleKeytypeof(T)。如果未找到匹配項,WPF將而不是嘗試回退到基本類型的樣式鍵。

Ellipse,例如,有一個隱含的[1]默認樣式關鍵的typeof(Ellipse),所以WPF只嘗試解決與該鍵隱式風格;在typeof(Shape)上鍵入的資源將不會被應用。

如果要使用隱式樣式,則需要爲每個具體類型定義一個隱含的Style。然而,這些樣式可以繼承setter和觸發器從一個共同的基礎Style

<Style x:Key="x" TargetType="{x:Type Shape}"> 
    <Setter Property="Stroke" Value="Black"/> 
</Style> 
<Style TargetType="Ellipse" BasedOn="{StaticResource x}" /> 
<Style TargetType="Path" BasedOn="{StaticResource x}" /> 
<Style TargetType="Polyline" BasedOn="{StaticResource x}" /> 

注意的是,雖然樣式基本類型不會被自動應用,但它們仍然兼容,而且可以顯式應用

<Style x:Key="StrokedShape" TargetType="{x:Type Shape}"> 
    <Setter Property="Stroke" Value="Black"/> 
</Style> 

<!-- ... --> 

<Ellipse Style="{StaticResource StrokedShape}" /> 

[1]一些WPF元件不覆蓋DefaultStyleKey。其中包括Shape及其子類。在這種情況下,WPF 假定爲默認約定。

+0

絕對是一種改進,謝謝!我似乎記得我知道這一點,......一定已經忘記了。 :) –