Предполагая, что вы загружаете растровые изображения (которые включают BMP, JPEG, PNG и т. Д. - все, что не является векторным изображением), вы можете использовать класс BitmapSource в System.Windows.Media.Imaging для чтения исходного изображения. PixelHeight и PixelWidth. В то время как вы можете загрузить изображение непосредственно в BitmapSource, если вы загружаете в элемент управления Image, вы можете получить доступ к BitmapSource напрямую через свойство Source изображения. Затем нужно просто определить, что для вас означает низкое разрешение - квадрат менее 50 пикселей, 100 пикселей, 200 пикселей и т. Д., И показать предупреждение, когда PixelHeight или PixelWidth меньше этого значения.
Собрав все воедино, скажем, мы хотим отобразить оранжевый прямоугольник поверх изображения, если его ширина составляет менее 100 пикселей или менее 100 пикселей. Используя реализацию без списка, мы могли бы сделать:
<Image x:Name="DemoImage" Source="demo.png"/>
<Rectangle Fill="Orange" Width="20" Height="20">
<Rectangle.Resources>
<local:LessThanConverter x:Key="LessThanConverter"/>
</Rectangle.Resources>
<Rectangle.Style>
<Style TargetType="Rectangle">
<Setter Property="Visibility" Value="Collapsed"/>
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=DemoImage, Path=Source.PixelHeight,
Converter={StaticResource LessThanConverter}, ConverterParameter=100}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
<DataTrigger Binding="{Binding ElementName=DemoImage, Path=Source.PixelWidth,
Converter={StaticResource LessThanConverter}, ConverterParameter=100}" Value="True">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Rectangle.Style>
</Rectangle>
Поскольку триггеры WPF проверяют только равенство, нам нужен преобразователь для сравнения двух значений - в этом случае наши фактическая высота / ширина пикселя и определенная нами высота / ширина пикселя делают изображение «низким разрешением» - и возвращают Значение true / false мы можем активировать. В приведенном выше коде он называется LessThanConverter. Код для конвертера прост:
/// <summary>
/// Converter to use in WPF triggers that returns true when
/// 'value' is less than 'parameter'.
/// </summary>
public class LessThanConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
return ((int)value < System.Convert.ToInt32(parameter));
}
public object ConvertBack(object value, Type targetType,
object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}
Затем, когда изображение загружено, стиль прямоугольника проверяет его триггеры, чтобы увидеть, имеет ли изображение высоту или ширину меньше 100 пикселей; если это так, он изменяет видимость прямоугольника со стандартного (Свернутый) на Видимый, тем самым показывая оранжевый прямоугольник в верхней части изображения. Конечно, вы можете легко использовать другой элемент для отображения, когда изображение имеет низкое разрешение.
Чтобы сделать это в списке, вам просто нужно обновить шаблоны элементов, чтобы они включали исходное изображение и значок предупреждения; затем примените стиль к значку предупреждения на основе изображения, с которым он связан. Вы не можете использовать привязку ElementName здесь, но одного из других типов привязки должно быть достаточно.
Или, оберните код ниже - который использует привязку ElementName - в пользовательский элемент управления, который содержит как изображение, так и значок предупреждения, и который вы можете использовать как обычный элемент управления изображения в шаблоне элемента, за исключением того, что ваш пользовательский элемент управления отображает предупреждение значок в дополнение к изображению (при отображении изображения с низким разрешением).