如何在UWP中指向PointerEntered时更改HyperlinkBut​​ton背景和前景色

时间:2017-11-17 07:36:14

标签: c# uwp windows-10-universal uwp-xaml

这是我在C#和XAML中的示例UWP代码 我在MainPage方法中创建了一个超链接按钮,并设置了样式属性,如前景和背景。

现在我想在像鼠标悬停一样触发PointerEntered事件时更改背景和前景颜色,在这种情况下只有字体大小正在变化而不是颜色

public MainPage(){
    this.InitializeComponent();

    var hLinkButton = new HyperlinkButton();

    hLinkButton.Name = "LearnMoreHyperLink";
    hLinkButton.Content = "Learn More...";

    hLinkButton.Background = new SolidColorBrush(Colors.Red);
    hLinkButton.Foreground = new SolidColorBrush(Colors.White);
    hLinkButton.FontWeight = FontWeights.SemiBold;
    hLinkButton.FontSize = 18.0;

    hLinkButton.PointerEntered += OnPointerEntered;
    LayoutGrid.Children.Add(hLinkButton);
}

private void OnPointerEntered(object sender, PointerRoutedEventArgs e){
    var hLButton = sender as HyperlinkButton;
    hLButton.Background = new SolidColorBrush(Colors.White);
    hLButton.Foreground = new SolidColorBrush(Colors.Red);
    hLButton.FontSize = 30.0;
}

// Only fontsize effecting on mouseover, background and foreground is not working

2 个答案:

答案 0 :(得分:2)

您可以覆盖HyperlinkBut​​ton的样式模板来实现此目的。

要执行此操作,您需要右键单击HyperLinkBut​​ton>修改模板>编辑副本。 然后将相关代码添加到可视状态。在您的情况下,视觉状态为“PointerOver”。

以下代码将HyperLinkBut​​ton的前景变为红色,背景变为白色。

  <VisualState x:Name="PointerOver">
      <Storyboard>
         <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
                                                     Storyboard.TargetProperty="Foreground">
           <DiscreteObjectKeyFrame KeyTime="0" Value="#FFFF0000" />
        </ObjectAnimationUsingKeyFrames>
        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="ContentPresenter"
                                                     Storyboard.TargetProperty="Background">
        <DiscreteObjectKeyFrame KeyTime="0" Value="#FFFFFFFF" />
       </ObjectAnimationUsingKeyFrames>
      </Storyboard>
   </VisualState>

修改

在c#代码中你正在做的是改变HyperLinkButton的背景和前景颜色,它覆盖控件的“正常”视觉状态的颜色。指针位于您的控件之上,XAML中预定义的默认控件样式(表示“PointerOver”状态)显示它应该的颜色,因此您只能在删除指针后看到更改从你的控制..

因此,在我看来,覆盖控件的xaml样式是正确和PointerOver事件的最佳解决方案..

Pointer over

请询问您对此可能有的任何进一步问题。如果需要,我将很乐意给出正确的解释。

答案 1 :(得分:1)

你应该这样做 -

hLinkButton.PointerEntered += hLinkButton_OnPointerEntered;

private void hLinkButton_OnPointerEntered(object sender, PointerRoutedEventArgs e)
{
    var hLButton = sender as HyperlinkButton;
    hLButton.Background = new SolidColorBrush(Colors.White);
    hLButton.Foreground = new SolidColorBrush(Colors.Red);
    hLButton.FontSize = 30.0;
}

如果你想要反向所有东西,你应该使用指针 hLinkBut​​ton_PointerExited 事件

<强>更新

什么是实际问题,一切看起来都很合适。

使用您的代码输出

Output

进一步你可以像我一样声明你的超级链接按钮

public sealed partial class MainPage : Page
{
    HyperlinkButton hLinkButton = new HyperlinkButton();

    public MainPage()
    {
        this.InitializeComponent();

        hLinkButton.Name = "LearnMoreHyperLink";
        hLinkButton.Content = "Learn More...";
        hLinkButton.Background = new SolidColorBrush(Colors.Red);
        hLinkButton.Foreground = new SolidColorBrush(Colors.White);
        hLinkButton.FontWeight = FontWeights.SemiBold;
        hLinkButton.FontSize = 18.0;
        hLinkButton.PointerEntered += OnPointerEntered;
        LayoutGrid.Children.Add(hLinkButton);
    }      

    private void OnPointerEntered(object sender, PointerRoutedEventArgs e)
    {
        hLinkButton.Background = new SolidColorBrush(Colors.White);
        hLinkButton.Foreground = new SolidColorBrush(Colors.Red);
        hLinkButton.FontSize = 30.0;
    }
}