12.09.2018

WPF: несколько полезных трюков

Недавно закончил работу над десктопным WPF-приложением. В нем я столкнулся с рядом задач, решение которых было не совсем очевидно, и я хочу ими поделиться.

1. Биндинг команд к событиям
Если разработчик хочет придерживаться MVVM модели, то для обработки событий он не сможет использовать стандартный обработчик команды в codebehind его xaml-формы. Для того, чтобы привязать событие и команду из ViewModel, он может использовать трюк, который предлагает JonghoL. В этом случае вам нужно просто написать следующий код:


Здесь добавляется пространство имен eb, в котором реализован класс EventBinding, который, в свою очередь может получать на вход название команды из ViewModel и возвращать в неё параметр.


2. Конвертер строки в BitmapImage
Когда программист добавляет на форму изображение и делает связку источника изображения с путем к какому-либо файлу, то доступ к данному файлу блокируется. Это не всегда удобно, например, если вы разрабатываете редактор изображений, то вам может понадобиться сохранение и удаление временных файлов, а они будут залочены элементом управления. В такой ситуации можно написать конвертер, преобразующий путь к изображению в BitmapImage, и использовать его при биндинге как обычный конвертер. Конвертер будет выглядеть так:

public sealed class StringToBitmapImageConverter : ValueConverterBase
{
    public override object Convert(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        object result = null;

        if (value is string uri)
        {
            BitmapImage image = new BitmapImage();
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.UriSource = new Uri(uri);
            image.EndInit();
            result = image;
        }

        return result;
    }
    
    public override object ConvertBack(object value, Type targetType, 
        object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}


3. Создание пунктирной рамки 
В WPF нет стандартной кисти для реализации пунктирной линии границы. Для реализации такого стиля существуют разные подходы, в т.ч. с использованием codebehind. Приведу тот, который нравится мне, при необходимости его можно модифицировать под конкретную задачу:
<LinearGradientBrush x:Key="CropRectangleAreaBorderBrush" 
                     MappingMode="Absolute"
                     SpreadMethod="Repeat"
                     StartPoint="0,0"
                     EndPoint="30,30">
    <GradientStop Offset="0" Color="#40009299" />
    <GradientStop Offset="0.5" Color="#40169E4C" />
    <GradientStop Offset="0.501" Color="Transparent" />
</LinearGradientBrush>


PS. Функциональность, представленная в пунктах 1 и 2, а также множество других полезных классов и методов, доступна в разрабатываемом мной фреймворке на github, а такжк в nuget-пакетах: Ak.Framework.Wpf и Ak.Framework.Core.

Комментариев нет:

Отправить комментарий