wpf - 如何更改视觉状态值并重用具有不同属性值的控件?
问题描述
我已经实现了一个自定义文本框,可以在MouseOver
事件中更改 BorderBrush(在这种情况下,它会更改 BorderBrush,但我可以更改其他属性)。
现在,如果我想自定义 BorderBrush 的颜色MouseOver
并使用不同的“BorderBrush on MouseOver”颜色创建不同的文本框,如何使用视觉状态来做到这一点?有没有为每个文本框定义不同样式的方法?
<ResourceDictionary>
<Style TargetType="{x:Type local:IconTextBox}">
<Setter Property="BorderThickness" Value="1"/>
<Setter Property="BorderBrush" Value="Black"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:IconTextBox}">
<Border x:Name="Border"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard>
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="Green" />
<!-- I want to change that Green -->
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ScrollViewer x:Name="PART_ContentHost"
Focusable="False"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</ResourceDictionary>
解决方案
您不需要单独的样式来更改颜色。您可以向 IconTextBox 添加依赖属性并根据该属性更改颜色。
在 IconTextBox.cs 中声明一个依赖属性:
public Color MouseOverBorderBrushColor
{
get { return (Color)GetValue(MouseOverBorderBrushColorProperty); }
set { SetValue(MouseOverBorderBrushColorProperty, value); }
}
public static readonly DependencyProperty MouseOverBorderBrushColorProperty =
DependencyProperty.Register("MouseOverBorderBrushColor", typeof(Color),
typeof(IconTextBox), new PropertyMetadata(null));
以您的风格绑定到属性:
<ControlTemplate TargetType="{x:Type local:IconTextBox}">
<Border x:Name="Border"
BorderThickness="{TemplateBinding BorderThickness}"
BorderBrush="{TemplateBinding BorderBrush}"
Background="{TemplateBinding Background}">
<Border.Resources>
<ResourceDictionary>
<Storyboard x:Key="ColorStoryboard">
<ColorAnimationUsingKeyFrames
Storyboard.TargetProperty="(Border.BorderBrush).(SolidColorBrush.Color)"
Storyboard.TargetName="Border">
<EasingColorKeyFrame KeyTime="0"
Value="{Binding MouseOverBorderBrushColor, RelativeSource={RelativeSource TemplatedParent}}" />
</ColorAnimationUsingKeyFrames>
</Storyboard>
</ResourceDictionary>
</Border.Resources>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualStateGroup.Transitions>
<VisualTransition GeneratedDuration="0:0:0.5" />
</VisualStateGroup.Transitions>
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver" Storyboard="{StaticResource ColorStoryboard}" />
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<ScrollViewer x:Name="PART_ContentHost"
Focusable="False"
HorizontalScrollBarVisibility="Hidden"
VerticalScrollBarVisibility="Hidden" />
</Border>
</ControlTemplate>
请注意,您不能在 VisualStateManager 中使用 TemplatedParent,因此我将情节提要作为静态资源添加到边框资源中并在 VisualStateManager 中使用。这个技巧在这里解释。
然后,您可以使用不同的鼠标悬停在边框画笔颜色上的 IconTextBoxes:
<local:IconTextBox MouseOverBorderBrushColor="Green" />
<local:IconTextBox MouseOverBorderBrushColor="Red" />
推荐阅读
- python - 对于应用了 base64 解码的数据,json.loads() 中的错误
- javascript - 如何在Vue JS中的计算属性内设置全局变量
- python - 即使文件可用,文件位置问题
- python - Django - 使 python 对象在会话期间持续存在
- enterprise-architect - 为什么我不能在 Enterprise Architect 中将一个对象(类的实例)连接到另一个对象(类的实例)的特定属性?
- ios - 模拟器上的后台获取工作(我可以看到日志)但不能在真实设备上工作
- javascript - 保险丝盒和打字稿:意外令牌{
- windows - Win 7 中的命令行:由于某些脚本不再工作,我意外更改了什么
- ios - 如何显示或隐藏 AGSArcGISMapImageLayer 子图层
- c# - 加载具有依赖引用的程序集