Vra

Ek probeer om 'n lys van persoonlike voorwerpe bind aan 'n WPF Image soos volg:

<Image>
    <Image.Source>
        <BitmapImage UriSource="{Binding Path=ImagePath}" />
    </Image.Source>
</Image>

Maar dit werk nie. Dit is die fout Ek kry:

"Eiendom" UriSource 'of eiendom' StreamSource 'gestel moet word. "

Wat mis ek?

Was dit nuttig?

Oplossing

WPF het ingeboude omsetters vir sekere tipes. As jy die prent se Source eiendom aan 'n string of Uri waarde bind, onder die enjinkap WPF sal 'n ImageSourceConverter ter waarde te omskep in 'n ImageSource.

So

<Image Source="{Binding ImageSource}"/>

sou werk indien die eiendom ImageSource was 'n string voorstelling van 'n geldige URI om 'n beeld.

Jy kan natuurlik rol jou eie Binding converter:

public class ImageConverter : IValueConverter
{
    public object Convert(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        return new BitmapImage(new Uri(value.ToString()));
    }

    public object ConvertBack(
        object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotSupportedException();
    }
}

en gebruik dit soos volg:

<Image Source="{Binding ImageSource, Converter={StaticResource ImageConverter}}"/>

Ander wenke

Hierdie artikel deur Atul Gupta het monster-kode wat 'n paar scenario's dek :

  1. beeld Gereelde hulpbron binding aan eiendom bron in XAML
  2. beeld Binding hulpbron, maar uit code agter
  3. beeld hulpbron Binding in kode agter deur gebruik te maak van Application.GetResourceStream
  4. Loading beeld van lêer pad via geheue stroom (Dieselfde geld wanneer die laai van die beeld blog data uit die databasis)
  5. beeld laai uit lêer pad, maar deur die gebruik van bindende na 'n lêer pad Property
  6. Binding beeld data om 'n gebruiker beheer wat intern het beeld beheer via afhanklikheid eiendom
  7. Dieselfde as punt 5, maar ook om te verseker dat die lêer nie kry gesluit op hardeskyf

Jy kan ook bloot te stel die Bron kenmerk eerder as die gebruik van die kind elemente. Om dit te doen jou klas moet die beeld terugkeer as 'n bitmapafbeelding. Hier is 'n voorbeeld van een manier wat ek dit gedoen

<Image Width="90" Height="90" 
       Source="{Binding Path=ImageSource}"
       Margin="0,0,0,5" />

En die eiendom klas is eenvoudig hierdie

public object ImageSource {
    get {
        BitmapImage image = new BitmapImage();

        try {
            image.BeginInit();
            image.CacheOption = BitmapCacheOption.OnLoad;
            image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
            image.UriSource = new Uri( FullPath, UriKind.Absolute );
            image.EndInit();
        }
        catch{
            return DependencyProperty.UnsetValue;
        }

        return image;
    }
}

Ek dink dit kan 'n bietjie meer werk as die waarde converter wees, maar dit is 'n ander opsie.

Die probleem met die antwoord wat hier gekies is dat wanneer heen en weer opgevolg, sal die converter ontslae veroorsaak elke keer as die webblad vertoon.

Dit veroorsaak nuwe lêer hanteer om voortdurend geskep word en sal enige poging om die lêer te verwyder, want dit is nog steeds in gebruik te blokkeer. Dit kan geverifieer word deur gebruik te maak van Proses Explorer.

As die beeld-lêer op 'n stadium kon geskrap word, 'n converter soos hierdie kan gebruik word: met behulp van XAML om te bind aan 'n System.Drawing.Image in 'n System.Windows.Image beheer

Die nadeel met hierdie geheue stroom metode is dat die beeld (s) kry gelaai en ontsyfer elke keer en geen caching kan plaasvind: "Om beelde te verhoed dat meer as een keer ontsyfer, die Image.Source eiendom van 'n Uri toewys eerder as die gebruik van geheue strome" Bron: "Performance wenke vir Windows Store programme met behulp van XAML"

Om die prestasie probleem op te los, kan die bron patroon gebruik word om 'n kas laag bied. Die kas kan plaasvind in die geheue, wat geheue probleme, of as miniatuur lêers wat in 'n tydelike gids wat gebruik kan word skoongemaak wanneer die app uitgange woon kan veroorsaak.

jy kan gebruik

  

ImageSourceConverter klas

om te kry wat jy wil

    img1.Source = (ImageSource)new ImageSourceConverter().ConvertFromString("/Assets/check.png");
Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top