2013-07-09 51 views
4

我還在學習Blend,請耐心等待。我在WPF項目中有一個切換按鈕,我需要更改不同狀態(如鼠標懸停和檢查)的文本顏色。但是,當我編輯模板並選擇contentPresenter時,唯一的畫筆是OpacityMask,它不受任何畫筆顏色更改的影響。如何更改Expression Blend中不同狀態按鈕的文本顏色?

我當然可以通過編輯樣式來改變文本的顏色,但這並不有用,因爲它處於我感興趣的編輯狀態。

基本上,我只是希望鼠標懸停,懸停等按鈕的文本更改,這似乎是一個合理的事情要做,但不能編輯ContentPresenter的OpacityMask Brush。

有人提到將ContentPresenter更改爲ContentControl。這確實有效,但我現在無法編輯按鈕實例的文本。我必須將ContentControl鏈接到某個東西嗎?

非常感謝您的幫助。我卡在這裏了幾個小時,我一直在到處尋找的答案,但無濟於事

+0

我不明白你爲什麼不能在風格上做到這一點。 –

+0

嗨Viktor,非常感謝您的回答,但是我想盡可能避免觸發器,因爲我正在尋找更靈活的東西(即設置它並忘記它),因爲我對文本屬性做了很多工作,每次都想設置觸發器。 Viv的回答是我遵循的,更新部分,因爲這允許我使用文本,就好像它只是一個普通的文本框。非常感謝您的幫助,雖然 –

回答

1

你可以做你在尋找什麼,而不必使用ContentControl並通過只使用VisualStateManager

我當然可以通過編輯樣式更改文本顏色,但這不是有用它在我感興趣的編輯狀態之內。

因此,例如說,國家對新Foreground顏色應用到你的ButtonMouseOver文字,

  • 首先混合物不爲Button.MouseOver.Foreground編輯Button模板時創建Brush資源。

所以我們來創建一個。(只需添加以下行與其他刷資源一起)

<SolidColorBrush x:Key="Button.MouseOver.Foreground" Color="Tomato" /> 
  • 現在我們可以應用StoryboardcontentPresenterTextElement.Foreground

所以你的VSM將類似於:

<VisualStateManager.VisualStateGroups> 
    <VisualStateGroup x:Name="CommonStates"> 
     <VisualState x:Name="Normal"/> 
     <VisualState x:Name="MouseOver"> 
     <Storyboard> 
     <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" 
             Storyboard.TargetProperty="(TextElement.Foreground)"> 
      <DiscreteObjectKeyFrame KeyTime="0"> 
      <DiscreteObjectKeyFrame.Value> 
       <SolidColorBrush Color="{Binding Source={StaticResource Button.MouseOver.Foreground}, Path=Color}" /> 
      </DiscreteObjectKeyFrame.Value> 
      </DiscreteObjectKeyFrame> 
     </ObjectAnimationUsingKeyFrames> 
     </Storyboard> 
     </VisualState> 
     <VisualState x:Name="Pressed"/> 
     <VisualState x:Name="Disabled"/> 
    </VisualStateGroup> 
</VisualStateManager.VisualStateGroups> 

,就是這樣。

請注意,我們在這裏做什麼就可以了ButtonContent僅僅是文字,但因爲這是您的使用是什麼在你的問題中提到,你應該罰款。

旁註:

您可以通過只切換ContentPresenterTextBlockControlTemplate做同樣的事情。

如果您需要Foreground可用的Button任何Content,然後葉剛剛切換ContentPresenterContentControl,你仍然可以在故事板VSM在一個非常類似的方式。

更新

要切換ContentPresenterContentControl,在你ControlTemplate只需切換實際元素與新的。

<ControlTemplate TargetType="{x:Type Button}"> 
    ... 
    <ContentPresenter x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" RecognizesAccessKey="True"/> 
    ... 
</ControlTemplate> 

到:

<ControlTemplate TargetType="{x:Type Button}"> 
    ... 
    <ContentControl x:Name="contentPresenter" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" Content="{TemplateBinding Content}"/> 
    ... 
</ControlTemplate> 

,你將不得不更新自己相應的屬性像如ContentControl不支持RecognizesAccessKeys,它也需要它Content="{TemplateBinding Content}"設置爲實際顯示的內容。使用ContentPresenterContent屬性是隱式設置的。

+0

嗨薇薇,非常感謝你,我現在正在嘗試它。只有一件事 - 是否可以將ContentPresenter更改爲ContentControl,我該怎麼做?或者,如果我將一個ContentControl或文本塊添加到控件模板中,我該如何使它成爲文本塊現在成爲按鈕內容的部分? –

+0

@JohnRooney檢查我的更新在帖子的底部。也只是搜索自定義'Button.Style'的其他例子,你會發現一些關於這些的體面的例子。如果我加上我能想到的每一點,我們會在這裏待上好幾個小時。去與谷歌搜索條款,如'WPF按鈕ContentPresenter VS ContentControl','WPF按鈕應用動態顏色到子控件','WPF爲什麼使用templateBinding',你應該有一個噸閱讀:) – Viv

+0

很多很多謝謝viv,我跟着你最近的更新,我需要對文本做更多的事情,所以它是一個更好的選擇,只是直接交換內容控制。謝謝你,你救了我很多頭痛,我找不到任何解決方案 –

1

前景屬性存在的風格。所以你可以編輯Style,在那裏你可以設置Foreground。這可能是這樣的

<Style.Triggers> 
    <Trigger Property="IsChecked" Value="False"> 
     <Setter Property="Foreground" Value="Blue"/> 
    </Trigger> 
</Style.Triggers> 

或者,如果你想改變它在ControlTemplate那麼你可以不喜歡這樣。

<Trigger Property="IsChecked" Value="True"> 
    <Setter Property="TextBlock.Foreground" TargetName="contentPresenterName" Value="White"/> 
</Trigger> 

所以在Expression Blend中你做這樣的

  1. 找到你的風格在資源面板,然後點擊旁邊的資源編輯資源按鈕。或者右鍵單擊並選擇編輯
  2. 添加觸發器觸發器面板。
  3. 轉到屬性面板,並更改前景財產。
相關問題