Я заметил, что моя разметка XAML тратит впустую ресурсы, делая преобразования, которые это не должно делать. например у меня есть следующий стиль, который действует как переключатель:
<Style TargetType="{x:Type Image}">
<Style.Triggers>
<DataTrigger Binding="{Binding IsDownloaded}" Value="True">
<Setter Property="Source"
Value="{Binding Data, Converter={StaticResource ByteArrayToBitmapImageConv}}"/>
</DataTrigger>
<DataTrigger Binding="{Binding IsDownloaded}" Value="False">
<Setter Property="Source"
Value="{Binding Url, Converter={StaticResource UrlToBitmapImageConv}}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Очевидно, это должно либо загрузить изображение, если оно не было кэшировано, либо превратить необработанные данные в BitmapImage. Проблема состоит в том, что, как только оба случая имели место, по крайней мере, один раз оба преобразователя вызываются при изменении DataContext, независимо от значения, которое имеет IsDownloaded
. Таким образом, он либо отобразит преобразованное изображение, но все равно загрузит его независимо в фоновом режиме, либо загрузит изображение и попытается преобразовать null
(данные) в BitmapImage.
Установка режима привязки на OneTime
сделал не помогло, к сожалению.
Я ищу чистый способ избежать этого, так как это даже происходит несколько раз в моем приложении. например здесь:
<Style TargetType="ContentControl">
<Setter Property="Content" Value="{StaticResource ContentNothingSelected}"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
Value="Description">
<Setter Property="Content" Value="{StaticResource DescriptionViewer}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
Value="WebPage">
<Setter Property="Content" Value="{StaticResource WebPageViewer}"/>
</DataTrigger>
<DataTrigger Binding="{Binding Source={x:Static local:App.Settings}, Path=DisplayMode_Current}"
Value="Media">
<Setter Property="Content" Value="{StaticResource MediaViewer}"/>
</DataTrigger>
</Style.Triggers>
</Style>
Даже если режим отображения установлен на Media
или Description
, приложение будет переходить на соответствующий сайт в фоновом режиме, тратить ресурсы и выбрасывать случайные неуместные уведомления об ошибках Javascript.
Ранее я делал большую часть этого в коде, но я изменил его, чтобы он был более декларативным, и я хотел бы сохранить его таким, любая помощь будет оценена.