C# 更改悬停时文本块外观的简单方法?

C# 更改悬停时文本块外观的简单方法?,c#,.net,wpf,textbox,C#,.net,Wpf,Textbox,我正在制作一个带有文本块指示器的缩放控件(滑块),它告诉你当前的比例因子是多少(有点像Word的右下角) 我学习WPF已经有几天了,我已经知道了如何做大部分工作,但我感觉有一种更简单的方法(一种可能只涉及XAML端代码而不是捕获一堆鼠标事件的方法) 我希望鼠标悬停在文本上方时,文本加下划线(表示可点击),并单击将滑块元素重置为1.0 以下是我所拥有的: <StatusBarItem Grid.Column="1" HorizontalAlignment="Right"> &l

我正在制作一个带有文本块指示器的缩放控件(滑块),它告诉你当前的比例因子是多少(有点像Word的右下角)

我学习WPF已经有几天了,我已经知道了如何做大部分工作,但我感觉有一种更简单的方法(一种可能只涉及XAML端代码而不是捕获一堆鼠标事件的方法)

我希望鼠标悬停在文本上方时,文本加下划线(表示可点击),并单击将滑块元素重置为1.0

以下是我所拥有的:

<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}" />