你說你要找的是有趣的,但不與WPF的心態工作,在其中將樣式應用於視覺或視覺類型(意思是:可以將樣式應用於某種類型,或將樣式定義爲具有指定鍵的資源並明確使用該鍵)。在你的情況,我想創建類似下面的風格應該做的:
<Style TargetType="{x:Type TextBox}">
<Setter Property="Width" Value="Auto"/>
</Style>
這會將樣式應用到所有的文本框,就離開了TargetElement屬性。
我知道這是不太一樣的,但如果你想在同一基本控制風格,這取決於使用短短的變化,你可以嘗試使用觸發器,使細微的變化吧。我通常使用我的控件的「標籤」屬性爲我的樣式定義提供一些額外的信息。示例基本按鈕樣式,但3個按鈕:
<Style.Triggers>
<Trigger Property="Tag" Value="delete">
<Setter Property="Background" Value="Red"></Setter>
</Trigger>
<Trigger Property="Tag" Value="confirm">
<Setter Property="Background" Value="Green"></Setter>
</Trigger>
</Style.Triggers>
現在有一些假設。
- 所有WPF的視覺效果有一個名爲「ParentVisual」的DependencyProperty,返回視覺 直接包含在可視化的問題:你想會是非常非常容易實現,如果兩個條件得到滿足什麼。
- 所有WPF的視覺效果有DepencyProperty,說「VisualType」
由於與觸發器結合本/ multitriggers會然後讓你創建觸發器的ParentVisual.VisualType。
讓我們來定義一些假設的CSS WPF的樣式應用於多數民衆贊成包含與包含在網格中的ID「subnavi」邊境內的任何文本框。
Grid Border#subnavi TextBox
{
backgroundColor:#FF0000;
}
翻譯成WPF,這將是一個Multitrigger對TextBox有三個條件:
<MultiTrigger>
<Condition Property="ParentVisual.VisualType" Value="Border"></Condition>
<Condition Property="ParentVisual.Name" Value="subnavi"></Condition>
<Condition Property="ParentVisual.ParentVisual.VisualType" Value="Grid"></Condition>
<Setter Property="Background" Value="Red"/>
</MultiTrigger>
但不幸的是,沒有這樣的DependencyProperties,所以你只能將能夠使用機制我上面提到如果你爲每個wpf控件創建包裝。
回到我稱之爲WPF的思維模式:WPF元素通過WPF引擎走過視覺樹而不是向下,從問題的控制開始。我認爲CSS反過來是相反的。
編輯:我認爲在上面寫的內容中使用DependencyObject類比使用Visual更明智。
它是一種恥辱,因爲WPF似乎在縮小網頁開發者和應用程序開發人員之間的差距,它不是世界末日必須給每個對象一個明確的樣式名稱,因爲無論如何它都可能被覆蓋,但是在將來維護和改變似乎有點多餘。 – somemvcperson