C# 更改悬停时文本块外观的简单方法?
我正在制作一个带有文本块指示器的缩放控件(滑块),它告诉你当前的比例因子是多少(有点像Word的右下角) 我学习WPF已经有几天了,我已经知道了如何做大部分工作,但我感觉有一种更简单的方法(一种可能只涉及XAML端代码而不是捕获一堆鼠标事件的方法) 我希望鼠标悬停在文本上方时,文本加下划线(表示可点击),并单击将滑块元素重置为1.0 以下是我所拥有的:C# 更改悬停时文本块外观的简单方法?,c#,.net,wpf,textbox,C#,.net,Wpf,Textbox,我正在制作一个带有文本块指示器的缩放控件(滑块),它告诉你当前的比例因子是多少(有点像Word的右下角) 我学习WPF已经有几天了,我已经知道了如何做大部分工作,但我感觉有一种更简单的方法(一种可能只涉及XAML端代码而不是捕获一堆鼠标事件的方法) 我希望鼠标悬停在文本上方时,文本加下划线(表示可点击),并单击将滑块元素重置为1.0 以下是我所拥有的: <StatusBarItem Grid.Column="1" HorizontalAlignment="Right"> &l
<StatusBarItem Grid.Column="1" HorizontalAlignment="Right">
<Slider x:Name="mapCanvasScaleSlider" Width="150" Value="1" Orientation="Horizontal" HorizontalAlignment="Left"
IsSnapToTickEnabled="True" Minimum="0.25" Maximum="4" TickPlacement="BottomRight"
Ticks="0.25, 0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4"/>
</StatusBarItem>
<StatusBarItem Grid.Column="2">
<TextBlock Name="zoomIndicator" Text="{Binding ElementName=mapCanvasScaleSlider,Path=Value,StringFormat=0%}"
MouseDown="ResetZoomWindow" MouseEnter="zoomIndicator_MouseEnter" MouseLeave="zoomIndicator_MouseLeave"
ToolTip="Zoom level; click to reset"/>
</StatusBarItem>
我觉得似乎有更好的方法通过XAML来实现这一点,而不是使用三个单独的.cs端函数。您可以为文本块使用样式触发器,如另一篇文章中所述 工作解决方案:
<StatusBarItem Grid.Column="2">
<TextBlock Name="zoomIndicator" Text="{Binding ElementName=mapCanvasScaleSlider,Path=Value,StringFormat=0%}"
MouseDown="ResetZoomWindow" ToolTip="Zoom level; click to reset">
<TextBlock.Style>
<Style>
<Setter Property="TextBlock.TextDecorations" Value="" />
<Style.Triggers>
<Trigger Property="TextBlock.IsMouseOver" Value="True">
<Setter Property="TextBlock.TextDecorations" Value="Underline" />
</Trigger>
</Style.Triggers>
</Style>
</TextBlock.Style>
</TextBlock>
</StatusBarItem>
不过,仍然需要手动重置缩放级别(我认为)。您可以使用VisualState(如果您使用Blend,它很容易编辑)。
就我个人而言,我更喜欢样式触发器,除非我必须添加故事板动画,否则我经常使用VisualState
通常,您不希望将
文本块作为按钮使用(当然您可以)您可能需要考虑使用更合适的控件,如<代码>按钮>代码>或<代码> HyrLink按钮> /Cord>,其中基本的鼠标事件处理已经被连接起来。然后可以应用任何您喜欢的样式。例如,“代码>按钮/<代码>控件,可以很容易地以鼠标下划线作为<代码>文本块< /代码>重新模板化。-超过:
<Style TargetType="Button" x:Key="LinkButtonStyle">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Grid>
<VisualStateManager.VisualStateGroups>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="Normal" />
<VisualState x:Name="MouseOver">
<Storyboard Duration="0:0:0.1">
<ObjectAnimationUsingKeyFrames Storyboard.TargetName="content" Storyboard.TargetProperty="TextDecorations">
<DiscreteObjectKeyFrame KeyTime="0">
<DiscreteObjectKeyFrame.Value>
<TextDecorationCollection>Underline</TextDecorationCollection>
</DiscreteObjectKeyFrame.Value>
</DiscreteObjectKeyFrame>
</ObjectAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
</VisualStateGroup>
</VisualStateManager.VisualStateGroups>
<TextBlock x:Name="content" Text="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
强调
通过引用样式键使用它:
<Button Content="click" Style="{StaticResource LinkButtonStyle}" />
使用这种方法(而不是将触发器添加到文本块的替代方法)会带来一些优势,这些优势内置于按钮控件中
您可以将样式应用于复合状态,如Pressed
您可以使用单击
事件及其相关的命令
属性
似乎已经成功了。更好的是,我甚至不需要使用边框!我会用工作代码编辑你的答案。
<Button Content="click" Style="{StaticResource LinkButtonStyle}" />