2016-06-24 59 views
1

是否有可能在WPF中編寫自定義觸發器,可以分層評估?WPF層次觸發器

更新:在這個例子中我使用的主題,但基於它好像我要澄清,我要求的方式來實現主題支持WPF的初步意見 - 這是編寫定製的觸發器和分層觸發器是利益在這裏,作爲替代,以MultiTrigger

在代碼中抽象的概念,你將與觸發器表達這種邏輯,當寫

if (theme == Themes.Black){ 
    if (IsMouseOver) 
     Background = Brushes.Cyan; 
    if (IsSelected) 
     Background = Brushes.Red; 
} 
if (theme == Themes.White){ 
    if (IsMouseOver) 
     Background = Brushes.Black; 
    if (IsSelected) 
     Background = Brushes.Grey; 
} 

然而喲u必須創建一套MultiTriggers

<MultiTrigger> 
    <MultiTrigger.Conditions> 
     <Condition Property="Theme" Value="Black"> 
     <Condition Property="IsMouseOver" Value="True"> 
    </MultiTrigger.Conditions> 
    <Setter Property="Background" Value="Cyan" /> 
</MultiTrigger> 
<MultiTrigger> 
    <MultiTrigger.Conditions> 
     <Condition Property="Theme" Value="White"> 
     <Condition Property="IsMouseOver" Value="True"> 
    </MultiTrigger.Conditions> 
    <Setter Property="Background" Value="Black" /> 
</MultiTrigger> 
// And so on... 

這很快變成難以處理的複雜的控制,所以我試圖想象的方式來美化這一點,一個想法想出了以下語法:

<HierarchicalTrigger Property="Theme" Value="Black"> 
    <HierarchicalTrigger.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="Cyan" /> 
     </Trigger> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="Red" /> 
     </Trigger> 
    </HierarchicalTrigger.Triggers> 
</HierarchicalTrigger> 

<HierarchicalTrigger Property="Theme" Value="White"> 
    <HierarchicalTrigger.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="Black" /> 
     </Trigger> 
     <Trigger Property="IsSelected" Value="True"> 
      <Setter Property="Background" Value="Grey" /> 
     </Trigger> 
    </HierarchicalTrigger.Triggers> 
</HierarchicalTrigger> 

有誰知道這樣的觸發器是否可以編寫,和/或有關於如何去做這個的任何提示?

+0

提供的主題是你實際想要做的,或者僅僅是一個例子? – plast1k

+0

只是一個例子,這可以用於任何事情 – havardhu

+0

WPF確實具有「主題」的概念,您可以爲每個主題聲明顏色或刷子資源,然後根據需要在觸發器/其他樣式設置器中使用這些資源。你有沒有對WPF主題進行過任何研究?如果是這樣,請更具體地說明爲什麼這種方法不適合你的情況。如果不是的話,你應該在提問之前進行研究。 –

回答

1

我會繼續並提供一個答案:

不,這是不可能的。

任何進入<Triggers>的東西都需要從TriggerBase繼承。 Taking a look at it你會發現最重要的虛擬方法(GetCurrentState()Seal())是內部的,所以除非你是微軟,否則你將無法修改該行爲。

+0

有這個,雖然... https://msdn.microsoft.com/en-us/library/ff725477(v=expression.40).aspx,在System.Windows.Interactivity命名空間中。但我不確定這是否可以使用... – havardhu

+0

https://msdn.microsoft.com/zh-cn/library/system.windows.triggerbase(v=vs.110) .aspx和https://msdn.microsoft.com/en-us/library/ff726552(v=expression.40).aspx以及它們可以使用的位置。只要看看繼承層次並閱讀頁面。 –

+0

是的,它似乎像交互觸發器不能用於風格,所以我想就是這樣。謝謝 – havardhu