2013-10-25 63 views
0

最近我閱讀了關於樣式和控件模板。正如它所說的,控制模板負責整個控制設計。但是,我想例如更改只有默認控件模板的特定部分,例如,當鼠標移動到,或控制具有焦點,當我寫這篇:設計響應觸發器,定義和使用WPF

<Style x:Key="StyleTextBox" TargetType="TextBox"> 
      <Setter Property="Margin" Value="5, 0"/> 
      <Setter Property="VerticalContentAlignment" Value="Center"/> 
      <Setter Property="HorizontalContentAlignment" Value="Left"/> 
      <Setter Property="BorderBrush" Value="Black"/> 
      <Setter Property="Background" Value="Transparent"/> 
      <Setter Property="SelectionBrush" Value="#CCFBE6D9"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate> 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="BorderBrush" Value="Black" /> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
</Style> 

..whole模板得到覆蓋...它的挺不爽...

那麼如何改變isMouseOver的視覺風格,而不是重寫整個默認風格?

回答

2

整個模板更換得到了,因爲你的XAML說,「設置Template這個ControlTemplate說我宣佈就在這裏。」問題是,你的模板是空的。當你想告訴WPF時使用模板,「使用這個可視化樹代表控件」。你給它一個空的視覺樹,並得到你所要求的;)。

但是,在這種情況下,您的意圖不是改變控件的視覺結構;你只是想改變一個屬性。您仍然可以使用TriggerSetter,但您無需創建模板即可。一個Style有自己的觸發器集合,因此你可以將它有:

<Style x:Key="StyleTextBox" TargetType="TextBox"> 
    <Setter Property="Margin" Value="5, 0"/> 
    <Setter Property="VerticalContentAlignment" Value="Center"/> 
    <Setter Property="HorizontalContentAlignment" Value="Left"/> 
    <Setter Property="BorderBrush" Value="Black"/> 
    <Setter Property="Background" Value="Transparent"/> 
    <Setter Property="SelectionBrush" Value="#CCFBE6D9"/> 
    <Style.Triggers> 
    <Trigger Property="IsMouseOver" Value="True"> 
     <Setter Property="BorderBrush" Value="Black" /> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

這工作,因爲你只是改變了風格的控件的屬性;通常,您可以期望模板遵循模板應用到的控件的頂級屬性。例如,默認的TextBox模板應確保TextBox的繪製背景符合模板父級的Background屬性。

模板上的觸發器在您想操縱在自定義模板中聲明的特定子元素的情況下更有用。