2012-03-28 19 views
0

我必須承認ControlTemplates的複雜運作並不是我準備好編寫有關書籍的東西。 :O)無法在ControlTemplate中使用效果

無論如何,我已經寫了一個自定義按鈕(必須有thosuands在那裏),以適應客戶的HMI(人機界面)的需求,當然,我已經提供了一個ControlTemplate它。

該按鈕總是顯示一個黑色陰影,但現在我想要它的陰影改變顏色,當按鈕變爲「熱」時,如鼠標懸停在它上面(按鈕類 - HmiToolbarButton - 支持d-屬性稱爲「IsHot」)。

這裏的(非工作)模板:

<Style TargetType="{x:Type local:HmiToolbarButton}"> 
    <Setter Property="AutoSize" Value="False" /> 
    <Setter Property="HotBehaviorNormal" Value="True" /> 
    <Setter Property="HorizontalAlignment" Value="Center" /> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:HmiToolbarButton}"> 
       <Grid x:Name="_grd"> 
        <Border 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         > 
         <ContentPresenter x:Name="PART_CONTENT" /> 
        </Border> 
        <local:ButtonHotDecorator IsHitTestVisible="False" IsChecked="{TemplateBinding IsChecked}" IsMouseOver="{TemplateBinding IsHot}" IsEnabled="{TemplateBinding HotBehaviorNormal}" /> 
        <Grid.Effect> 
         <DropShadowEffect ShadowDepth="0" Opacity="0.9" BlurRadius="10" Color="{TemplateBinding DropShadowColor}" /> 
        </Grid.Effect> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsHot" Value="True"> 
         <Setter TargetName="_grd" Property="Effect"> 
          <Setter.Value> 
           <!-- *** PROBLEM HERE *** --> 
           <DropShadowEffect 
            ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
            Color="{TemplateBinding HotDropShadowColor}" 
            /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

黑色陰影工作正常,但我沒有得到任何效果都沒有,當我把鼠標移動到按鈕上。我懷疑這是TemplateBinding這是行不通的,因爲如果我將其更改爲一個常量的顏色,效果將按預期顯示。

任何提示將不勝感激。

謝謝

回答

3

有時TemplateBinding無法直接在模板本身內部進行解析。在這裏,你在一個觸發器內的Setter中使用了一個新的對象實例,所以這可能是問題所在。嘗試使用RelativeSource代替觸發器中的一個:

<DropShadowEffect 
    ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
    Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotDropShadowColor}" 
    /> 
+0

謝謝John,就是這樣。我意識到我需要閱讀模板,但我發現很難在任何地方找到好的和詳盡的文檔。你能推薦一個或兩個資源嗎?這將不勝感激。乾杯! – 2012-03-29 07:36:57

+0

WPF控件開發Unleashed具有與控件相關的所有內容,但我認爲缺少一些像VisualStateManager和行爲這樣的新東西。 – 2012-03-29 13:43:06