【发布时间】:2019-07-10 12:45:56
【问题描述】:
好的,伙计们,我正在尝试使用 .png 图像制作一个图像按钮,但我只需要使用 XAML 制作一个可点击的非透明部分。
我尝试了很多使用自定义图像类,但这些尝试都不适合我。
这是我正在使用的 png 图像的示例。
这是我在 xaml 中的图像按钮的示例代码。
<Style x:Key="Home1_Unlocked" TargetType="Button">
<Setter Property="Width" Value="611"/>
<Setter Property="Height" Value="541"/>
<Setter Property="ClickMode" Value="Press"/>
<Setter Property="Focusable" Value="False"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Setter Property="VerticalAlignment" Value="Top"/>
<Setter Property="Margin" Value="100,50,0,0"/>
<Setter Property="UIElement.SnapsToDevicePixels" Value="True"/>
<Setter Property="Control.Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid Name="WholeButton" Background="Transparent">
<ui:MapObject x:Name="Home" Stretch="Uniform" Source="/Resources/Game/map/but1_dim.png">
<!--<ui:MapObject.RenderTransformOrigin>
<Point X="0.5" Y="0.5"/>
</ui:MapObject.RenderTransformOrigin>
<ui:MapObject.RenderTransform>
<ScaleTransform ScaleX="0.5" ScaleY="0.5" />
</ui:MapObject.RenderTransform>-->
</ui:MapObject>
<Grid Margin="0,0,0,150" HorizontalAlignment="Center" VerticalAlignment="Bottom">
<TextBlock Text="0 of 0 STARS" Style="{DynamicResource Riffic}" Margin="130,0,00,0" Foreground="White" VerticalAlignment="Center" HorizontalAlignment="Right" FontSize="40">
<TextBlock.Effect>
<DropShadowEffect Color="Black"/>
</TextBlock.Effect>
</TextBlock>
<Image Grid.Column="0" Source="/Resources/Game/map/wmapenable.png" HorizontalAlignment="Left" Margin="10,0,0,0" Stretch="None"/>
<Image Grid.Column="0" Source="/Resources/Game/map/big1.png" HorizontalAlignment="Left" Margin="40,0,0,0" Stretch="None"/>
</Grid>
<ContentPresenter Name="MyContentPresenter" Content="{TemplateBinding ContentControl.Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0,0,0,0"/>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter TargetName="Home" Property="Source" Value="/Resources/Game/map/but1.png"/>
</Trigger>
<Trigger Property="ButtonBase.IsPressed" Value="True">
<Setter TargetName="WholeButton" Property="RenderTransform">
<Setter.Value>
<ScaleTransform ScaleX="1.01" ScaleY="1.01" />
</Setter.Value>
</Setter>
<Setter TargetName="WholeButton" Property="RenderTransformOrigin">
<Setter.Value>
<Point X="0.5" Y="0.5"/>
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
这是自定义图像类...
public class MapObject : Image
{
protected override HitTestResult HitTestCore(PointHitTestParameters hitTestParameters)
{
var source = (BitmapSource)Source;
// Get the pixel of the source that was hit
var x = (int)(hitTestParameters.HitPoint.X / ActualWidth * source.PixelWidth);
var y = (int)(hitTestParameters.HitPoint.Y / ActualHeight * source.PixelHeight);
// Copy the single pixel into a new byte array representing RGBA
var pixel = new byte[4];
source.CopyPixels(new Int32Rect(x, y, 1, 1), pixel, 4, 0);
// Check the alpha (transparency) of the pixel
// - threshold can be adjusted from 0 to 255
if (pixel[3] < 10)
return null;
return new PointHitTestResult(this, hitTestParameters.HitPoint);
}
}
有人可以帮我做这个吗?
【问题讨论】:
-
如果图片只是一个图标,最好使用 Path 元素而不是 Image。
-
不,它不是图标,我将图像添加到要澄清的问题中
-
我认为最简单的方法是绘制基于矢量图的图形。您也可以将 PNG 转换为矢量图形,但这需要一些返工和一些好的算法(Adobe Ilustrator)。一旦它是基于矢量的图形(不是基于像素),您就可以将其转换为 XAML 资源(由几何图形组成的图形)。这样可以很容易地完成您所需要的。
-
我能想到的所有其他选项都相当复杂或不准确。例如。使用边缘检测算法在图像周围画一个
Path。或者在图像周围绘制一个与图像尽可能接近的矩形。目标是覆盖图像以消除命中测试。 -
使用矢量而不是 png 图像不能解决问题。我可以通过制作自己的自定义按钮并使用代码隐藏按钮效果和其他东西而不是使用 XAML 来做到这一点。