WPF如何在同一个区域依次叠加显示多张图片呢?

正如标题的问题,有时需要在已显示的图片的右上角(或其他区域)显示小图标,譬如下图的患者头像右上角显示病情图标:(这里不采用事先用PS编排成一个图片文件的方式,因为此方式普适性不好)

解决方案:绘制该复合图像(不希望覆盖上一张图片的区域需要将当前图片相应区域处理成透明,不赘述),创建一个 ImageDrawing 并设置它的 ImageDrawing.ImageSource 和 ImageDrawing.Rect 属性。  ImageDrawing.ImageSource    属性指定要绘制的图像,ImageDrawing.Rect 属性指定每个图像的位置和大小。

<Border Grid.ColumnSpan="3" BorderBrush="Transparent" BorderThickness="2" 
        Visibility="{Binding Converter={x:Static js:Converters.BooleanToVisibility}, Path=IsNormal}">
    <Image Stretch="None" Opacity="{Binding ImageOpacity}">
        <Image.Source>
            <DrawingImage >
                <DrawingImage.Drawing>
                    <DrawingGroup>
                        <ImageDrawing Rect="0,0,48,48" ImageSource="{Binding Image}"/>
                        <ImageDrawing Rect="38,0,20,20" ImageSource="{Binding Converter={StaticResource IllnessSeverityToImageConverter}, Path=Encounter.IllnessSeverity}"/>
                    </DrawingGroup>
                </DrawingImage.Drawing>
            </DrawingImage>
        </Image.Source>
    </Image>
</Border>

DrawingGroup还可以加入绘制的图形,譬如:

                    <DrawingGroup>
                        <ImageDrawing Rect="0,0,48,48" ImageSource="{Binding Image}"/>
                        <ImageDrawing Rect="38,0,20,20" ImageSource="{Binding Converter={StaticResource IllnessSeverityToImageConverter}, Path=Encounter.IllnessSeverity}"/>
                        <GeometryDrawing Brush="{Binding Converter={StaticResource NurseLevelCodeToBrushConverter}, Path=Encounter.NurseLevel}">
                                                <GeometryDrawing.Geometry>
                                                    <EllipseGeometry Center="10,50" RadiusX="5"  RadiusY="5"/>
                                                </GeometryDrawing.Geometry>
                                                <GeometryDrawing.Pen>
                                                    <Pen Brush="Black" Thickness="0.5" />
                                                </GeometryDrawing.Pen>
                                            </GeometryDrawing>
                    </DrawingGroup>


下面是转换器代码:

public class IllnessSeverityToImageConverter : IValueConverter
{
    #region IValueConverter Members
    /// <summary>
    /// Convert forward function.
    /// </summary>
    /// <param name="value">The source value.</param>
    /// <param name="targetType">The target type.</param>
    /// <param name="parameter">The parameter.</param>
    /// <param name="culture">The culture info.</param>
    /// <returns>The converted value.</returns>
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        IllnessSeverity severity = value as IllnessSeverity;
        if (severity != null)
        {
            if (severity.Id == IllnessSeverity.Emergent.Id)
                return ResourceHelper.IllnessSeverityUrgent;
            else if (severity.Id == IllnessSeverity.Critical.Id)
                return ResourceHelper.IllnessSeverityDangerous;
            else
                return null;
        }

        return null;
    }

    /// <summary>
    /// Convert back function.
    /// </summary>
    /// <param name="value">The source value.</param>
    /// <param name="targetType">The target type.</param>
    /// <param name="parameter">The parameter.</param>
    /// <param name="culture">The culture info.</param>
    /// <returns>The converted back value.</returns>
    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}
原文地址:https://www.cnblogs.com/chriskwok/p/3480750.html