为什么我的椭圆的不透明度会自动改变,而实际上我并没有在代码中改变它

本文关键字:改变 实际上 并没有 代码 为什么 不透明度 我的 | 更新日期: 2023-09-27 17:49:29

我有一个椭圆在我的Windows通用应用程序,我想改变它的填充颜色,当鼠标进入和离开该椭圆。我只想改变颜色,别无其他。然而,当我进入鼠标时,不透明度会自动降低。你能帮我找出代码中的问题吗?

谢谢。

XAML

        <Ellipse x:Name="glamourEllipse" HorizontalAlignment="Left" Height="226" Margin="594,260,0,0" Stroke="#FFB43F3F" VerticalAlignment="Top" Width="226" RenderTransformOrigin="0.5,0.5" UseLayoutRounding="False" d:LayoutRounding="Auto" Tapped="glamour_Tapped">
            <Ellipse.Fill>
                <SolidColorBrush Color="#FFB43C3C"/>
            </Ellipse.Fill>
            <Ellipse.RenderTransform>
                <CompositeTransform Rotation="-90.254"/>
            </Ellipse.RenderTransform>
        </Ellipse>
c#

    SolidColorBrush hoverBrush = new SolidColorBrush();
    private void mouse_Enter(object sender, PointerRoutedEventArgs e)
    {
        hoverBrush.Color = Color.FromArgb(100, 140, 40, 40);
        hoverBrush.Opacity = 1;
        nsfwEllipse.Fill = hoverBrush;
    }
    private void mouse_Exit(object sender, PointerRoutedEventArgs e)
    {
        hoverBrush.Color = Color.FromArgb(100, 180, 60, 60);
        hoverBrush.Opacity = 1;
        nsfwEllipse.Fill = hoverBrush;
    }

为什么我的椭圆的不透明度会自动改变,而实际上我并没有在代码中改变它

问题很可能是您改变了MouseEnterMouseExit事件的透明度:

<SolidColorBrush Color="#FFB43C3C"/>

这行设置颜色为255 alpha, 180 red, 60 green and 60 blue。另一方面,您的代码:

hoverBrush.Color = Color.FromArgb(100, 140, 40, 40);
hoverBrush.Color = Color.FromArgb(100, 180, 60, 60);

两行都指定100中的alpha。现在,在我们的decimal数学系统中,这将是完全有效的,并且意味着100%不透明,但在计算机的8-bit32-bit世界中,它不是。基本上,该代码将alpha设置为64十六进制。(改变XAML中的FF,你会看到透明度是一样的。)

Color.FromArgb的重载期望0是透明的,255是不透明的。

https://msdn.microsoft.com/en-us/library/system.drawing.color.fromargb%28v=vs.110%29.aspx

基本上,在Color.FromArgb行中将100更改为255,然后您就可以了。

private void mouse_Enter(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(255, 140, 40, 40);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}
private void mouse_Exit(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(255, 180, 60, 60);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}

或者,将该值全部删除。

private void mouse_Enter(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(140, 40, 40);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}
private void mouse_Exit(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(180, 60, 60);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}

两个选项总体上具有相同的效果。第二个还保证您不会意外地再次执行此操作,因为alpha始终与它一起成为255

编辑:最后,为了完整性,你也可以在代码中使用十六进制,这可能是更好的选择,因为它都是一样的:
private void mouse_Enter(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(0xFF, 0x8C, 0x28, 0x28);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}
private void mouse_Exit(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(0xFF, 0xB4, 0x3C, 0x3C);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}

或:

private void mouse_Enter(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(0x8C, 0x28, 0x28);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}
private void mouse_Exit(object sender, PointerRoutedEventArgs e)
{
    hoverBrush.Color = Color.FromArgb(0xB4, 0x3C, 0x3C);
    hoverBrush.Opacity = 1;
    nsfwEllipse.Fill = hoverBrush;
}