2012-08-09 11 views
10

Po pewnym wyszukiwaniu wydaje się, że załadowanie obrazu w środowisku wykonawczym do okna WPF wydaje się dość skomplikowane !?Jak załadować obraz do WPF w środowisku wykonawczym?

 Image image; 
     image = new Uri("Bilder/sas.png", UriKind.Relative); 
     ????.Source = new BitmapImage(image); 

Próbuję tego kodu, ale potrzebuję pomocy, aby go uruchomić. Dostaję czerwone linie poniżej kodu! Zastanawiam się również, jeśli trzeba dodać trochę dodatkowego kodu wewnątrz kodu XAML lub jest w tyle z tym:

<Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="350" /> 

Wonder becuase Widziałem przykłady z sorces do zdjęć wewnątrz znaczników XAML.

EDIT:

Używam tego wiedzieć:

 var uri = new Uri("pack://application:,,,/sas.png"); 
     var bitmap = new BitmapImage(uri); 
     image1.Source = bitmap; 

XAML:

<Grid Width="374"> 
    <Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="image1" Stretch="Fill" VerticalAlignment="Top" Width="350" /> 
    <Button Content="Start" Height="23" HorizontalAlignment="Left" Margin="12,226,0,0" Name="btnStart" VerticalAlignment="Top" Width="75" /> 
    <Button Content="Land" Height="23" HorizontalAlignment="Left" Margin="287,226,0,0" Name="btnLand" VerticalAlignment="Top" Width="75" /> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="110,226,0,0" Name="cmbChangeRoute" VerticalAlignment="Top" Width="156" /> 

</Grid> 

EDIT 2: Moja odpowiedź brzmi "rozwiązany", ale som pomocy z zewnątrz Przepełnienie stosu. Ten kod działa poprawnie:

 BitmapImage image = new BitmapImage(); 
     image.BeginInit(); 
     image.UriSource = new Uri("pack://application:,,,/Resources/" + company + ".png"); 
     image.EndInit(); 
     image2.Source = image; 
+2

tych pierwszych dwa wiersze kodu nie mogą mieć racji; URI NIE jest obrazem. –

+0

Dzięki! Ale wiedz, że narzeka na ścieżkę! Szuka ścieżki w C: kiedy powinno być bin/debug !? –

Odpowiedz

4

Upewnij się, że sas.png jest oznaczony jako Build Action: Content i Copy To Output Directory: Copy Always w swoim Visual Studio Properties ...

Myślę, że kod C# source idzie tak ...

 Image image = new Image(); 
    image.Source = (new ImageSourceConverter()).ConvertFromString("pack://application:,,,/Bilder/sas.png") as ImageSource; 

i XAML powinny być

 <Image Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" 
      Name="image1" Stretch="Fill" VerticalAlignment="Top" 
      Source="../Bilder/sas.png" 
      Width="350" /> 

EDIT

Dynamicznie myślę XAML zapewni najlepszy sposób, aby załadować zdjęcia ...

 <Image Source="{Binding Converter={StaticResource MyImageSourceConverter}}" 
      x:Name="MyImage"/> 

gdzie image.DataContext jest string ścieżka.

MyImage.DataContext = "pack://application:,,,/Bilder/sas.png"; 

    public class MyImageSourceConverter : IValueConverter 
    { 
     public object Convert(object value_, Type targetType_, 
     object parameter_, System.Globalization.CultureInfo culture_) 
     { 
      return (new ImageSourceConverter()).ConvertFromString (value.ToString()); 
     } 

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

Teraz jak ustawić inny kontekst danych Image będą automatycznie ładowane przy starcie.

+0

Hmm, ale jeśli chcę załadować różne obrazy w czasie wykonywania. Kiedy utworzę obiekt okna WPF, chcę przekazać różne obrazy, to zgaduję, że kod XAML wyglądałby inaczej? Zapisałem wszystkie obrazy w filderze wewnątrz Bin/Debug, OK? –

+0

sprawdź moją edytowaną odpowiedź powyżej. –

+0

Dzięki! Ale czy jego droga do skomplikowania nie polega na użyciu niektórych obrazów !? –

28

W WPF obraz jest zwykle ładowany z Stream lub Uri.

BitmapImage obsługuje zarówno i Uri można nawet przekazany jako argument konstruktora:

var uri = new Uri("http://..."); 
var bitmap = new BitmapImage(uri); 

Jeśli plik obrazu znajduje się w folderze lokalnym, trzeba by użyć file:// Uri.Można utworzyć taką Uri ze ścieżki jak ta:

var path = Path.Combine(Environment.CurrentDirectory, "Bilder", "sas.png"); 
var uri = new Uri(path); 

Jeśli plik obrazu jest zasobem w zespole, URI musi przestrzegać schematu Pack Uri:

var uri = new Uri("pack://application:,,,/Bilder/sas.png"); 

w tym przypadku Działanie kompilacji Visual Studio dla sas.png musi być Resource.

Po utworzeniu BitmapImage a także mieć Image kontrolę jak w tym XAML

<Image Name="image1" /> 

byś po prostu przypisać BitmapImage do nieruchomości Source tej kontroli Obrazek:

image1.Source = bitmap; 
+0

Proszę, zobacz moją edycję! –

+0

Ale co z kodem w XAML ?! W ten sposób:

+0

Czy przeczytałeś mój komentarz do twojego pytania? – Clemens

Powiązane problemy