基本上我有一个按钮,我为其构建了一个控件模板。它目前正在运行,但VS 2010抱怨我的控件模板中的以下代码行
<TextBlock Text="{TemplateBinding Content}"
Foreground="{TemplateBinding Foreground}"
x:Name="cContentTextBlock" />
控件模板用于Button,我有各种以VisualBlock为目标的VisualStates。
我可以看到为什么VS2010抱怨...如果内容实际上不是文本怎么办?这会引起问题。对我来说,最重要的是我想设置文本的前景以响应视觉状态的变化。
关于如何实现这一目标的任何想法? (尝试一下,它有效......但是vs2010的设计师会对它嗤之以鼻)
以下是整个风格:
<Style x:Key="PassiveLinkButton" TargetType="Button">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Grid>
<vsm:VisualStateManager.VisualStateGroups>
<vsm:VisualStateGroup x:Name="CommonStates">
<vsm:VisualState x:Name="MouseOver">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="cMouseOverBorder" Storyboard.TargetProperty="BorderBrush">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Black" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="Normal"/>
<vsm:VisualState x:Name="Pressed">
<Storyboard>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="cMouseOverBorder" Storyboard.TargetProperty="BorderBrush">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Blue" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="cContentTextBlock" Storyboard.TargetProperty="Foreground">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<SolidColorBrush Color="Blue" />
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</vsm:VisualState>
<vsm:VisualState x:Name="Disabled"/>
</vsm:VisualStateGroup>
</vsm:VisualStateManager.VisualStateGroups>
<Border x:Name="cFocusBorder"
BorderThickness="1"
BorderBrush="{StaticResource BorderBrush}"
Margin="2">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border x:Name="cMouseOverBorder"
BorderBrush="Transparent" BorderThickness="0,0,0,1" Margin="0 0 0 2">
<StackPanel HorizontalAlignment="Left">
<TextBlock Text="{TemplateBinding Content}" Foreground="{TemplateBinding Foreground}"
x:Name="cContentTextBlock" Margin="2 2 2 0"
HorizontalAlignment="Center" />
</StackPanel>
</Border>
</Grid>
</Border>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
将使用如下:
<Button Content="Press Me" Style={StaticResource PassiveButtonLink}" />
答案 0 :(得分:0)
如果你还没有,我会通读这篇MSDN文档:
演练:使用ControlTemplate自定义按钮的外观 http://msdn.microsoft.com/en-us/library/cc903963(VS.95).aspx
如果你需要更深入的话:
使用ControlTemplate自定义现有控件的外观 http://msdn.microsoft.com/en-us/library/cc189093(VS.95).aspx
通过创建ControlTemplate创建新控件
http://msdn.microsoft.com/en-us/library/cc278064(VS.95).aspx
答案 1 :(得分:0)
我有类似的问题。我的解决方案是更改我的默认XML命名空间。
以下内容适用于我的VS2008副本,但VS2010中的不是:
xmlns="http://schemas.microsoft.com/netfx/2007/xaml/presentation"
以下适用于两个 VS2008和VS2010:
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
通过“工作”,我的意思是WPF设计器识别TemplateBinding元素。