Установить BitmapImage динамически через привязку с помощью конвертера в XAML - PullRequest
0 голосов
/ 18 июня 2020

У меня есть следующий xaml (обратите внимание, что он используется в действии Microsoft Workflow Foundation и содержится в <sap:ActivityDesigner.Icon>. Надеюсь, это не имеет значения, но я подумал, что упомянул бы об этом.)

<DrawingBrush>
    <DrawingBrush.Drawing>
        <ImageDrawing>
            <ImageDrawing.Rect>
                <Rect Location="0,0" Size="16,16" ></Rect>
            </ImageDrawing.Rect>
            <ImageDrawing.ImageSource>
                <BitmapImage UriSource="MyImage.png"/>
            </ImageDrawing.ImageSource>
        </ImageDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

Мне нужно изменить UriSource во время выполнения, поэтому я решил использовать конвертер как таковой:

<DrawingBrush>
    <DrawingBrush.Drawing>
        <ImageDrawing>
            <ImageDrawing.Rect>
                <Rect Location="0,0" Size="16,16" ></Rect>
            </ImageDrawing.Rect>
            <ImageDrawing.ImageSource>
                <BitmapImage UriSource="{Binding Path=MyObject, Converter={StaticResource NameToImageConverter}}"/>
            </ImageDrawing.ImageSource>
        </ImageDrawing>
    </DrawingBrush.Drawing>
</DrawingBrush>

, но если попытаться привязать его к моему объекту и использовать конвертер , Я получаю следующую ошибку:

Предоставленный DependencyObject не является контекстом для этого Freezable

Обратите внимание, что он не попадает в мой конвертер.

Я обнаружил Предоставленный DependencyObject не является контекстом для этого Freezable WPF c#, который, как я думал, поможет, но безрезультатно.

При установке имени для объекта BitmapImage

<BitmapImage Name="MyBitmapImage"/>

Я думал, что смогу установить это с помощью кода, но все равно получаю ту же ошибку.

I не знаю, что я сделал с тех пор, как впервые посмотрел на это, но изначально у меня была ошибка, в которой говорилось что-то вроде того, что я должен использовать beginInit и endInit. Извините, нет точной ошибки, так как я не могу ее воспроизвести.

Есть идеи, как этого можно достичь?

Спасибо.

1 Ответ

1 голос
/ 19 июня 2020

BitmapImage реализует интерфейс ISupportInitialize и может быть инициализирован только один раз и не может быть изменен позже. Если ваш MyObject должен изменить свое значение во время выполнения и уведомить пользовательский интерфейс, это не сработает.

Вы можете изменить привязку на

<ImageDrawing
    ImageSource="{Path=MyObject, Converter={StaticResource NameToImageConverter}}"
    Rect="0,0,16,16" />

и сделать преобразователь привязки вернуть BitmapImage вместо Uri:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    ...
    string uri = ...;
    return new BitmapImage(new Uri(uri));
}
...