2011-09-09 52 views
5

我懷疑這是可能的,但只是想確認。應用WPF樣式,比如CSS和HTML

我寫一個簡單的WPF應用程序,並希望在外部定義我的風格,所以你基本上可以加載風格的外部資源。有點像CSS和HTML是如何分離出來的......

但是有一件事讓我感到困惑,那就是用HTML & CSS更像是一種外部尋找方法,CSS針對元素並應用於匹配元素。然而,隨着WPF似乎它周圍的其他方法,你一定要告訴什麼風格就應該開始應用的元素,但是這似乎並不十分動態。所以我只想知道是否有一種方法可以應用樣式,以便樣式只針對元素。

一個例子是這樣的:

<Style TargetType="{x:Type TextBox}" TargetElement="{x:Name SomeTextboxElement}"> 
    <Setter Property="Width" Value="Auto"/> 
</Style> 

因爲通常你必須指定的風格的關鍵,然後拿到元素(SomeTextboxElement)映射到風格的關鍵。

這似乎有點愚蠢,不得不明確地給每個元素一個樣式綁定,它應該更分層和過濾下來(這可能是可能的,我只是不知道如何),而不是一對一的映射。將永遠樣式整個應用程序...

希望是有道理的......

回答

2

你說你要找的是有趣的,但不與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更明智。

+0

它是一種恥辱,因爲WPF似乎在縮小網頁開發者和應用程序開發人員之間的差距,它不是世界末日必須給每個對象一個明確的樣式名稱,因爲無論如何它都可能被覆蓋,但是在將來維護和改變似乎有點多餘。 – somemvcperson

0

您正在尋找隱式樣式。它們不像css選擇器那樣精細,但可以爲每種元素定義樣式。例如,下面的例子說:「我想我所有的按鈕,有80的寬度」

<Style TargetType="{x:Type Button}"> 
    <Setter Property="Width" Value="80"/> 
</Style> 

這些定義可以在幾個不同的領域來完成:應用程序,網頁,控制,或任何框架元素只是將其添加爲資源。在搜索隱式樣式時,運行時將採用自下而上的方法,並且將使用它創建的第一個樣式。

查看this article瞭解更多詳情。