我还在学习Blend,所以请耐心等待。我在WPF项目中有一个切换按钮,我需要更改不同状态的文本颜色,如mouseover和checked。但是,当我编辑模板并选择contentPresenter时,唯一的画笔是OpacityMask,它不受任何画笔颜色变化的影响。
我当然可以通过编辑样式来更改文本颜色,但这没有用,因为它在编辑中我感兴趣的状态。
基本上,我只是想在鼠标悬停,悬停等方面改变按钮的文本,这似乎是合理的事情,但是无法编辑ContentPresenter的OpacityMask画笔。
有人提到将ContentPresenter更改为ContentControl。这确实有效,但我现在无法编辑按钮实例的文本。我是否必须将ContentControl链接到某些内容?
非常感谢您的帮助。我被困在这里几个小时,我一直在寻找答案,但无济于事
答案 0 :(得分: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>
所以在表达式混合中你就像这样做
答案 1 :(得分:1)
您无需使用ContentControl
并只使用VisualStateManager
我当然可以通过编辑样式来更改文本颜色,但这没有用,因为它在编辑中我感兴趣的状态。
所以说例如,将Foreground
颜色应用于Button
的文字的状态为MouseOver
,
Brush
模板时,Blend不会为Button.MouseOver.Foreground
创建Button
资源。所以让我们创建一个。 (只需添加以下行以及其他画笔资源)
<SolidColorBrush x:Key="Button.MouseOver.Foreground" Color="Tomato" />
Storyboard
应用于TextElement.Foreground
的{{1}}。所以你的VSM看起来像:
contentPresenter
就是这样。
请注意,当<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>
的{{1}}只是文字时,我们在这里做的只会 ,但是因为这就是你在你的问题,你应该没事。
<强>旁注:强>
只需将Content
切换为Button
中的ContentPresenter
即可完成相同的操作。
如果TextBlock
ControlTemplate
的任何Foreground
需要Content
,那么您只需将Button
切换为ContentPresenter
即可仍然是你的VSM故事板以非常相似的方式。
<强>更新强>:
要将ContentControl
切换为ContentPresenter
,请在ContentControl
中将实际元素切换为新元素。
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}"
隐式设置ContentPresenter
属性。