Grid Bild dynamisch mit relativen Pfad laden?



  • Servus,

    meine ersten Schritte mit XAML und C# sind beschwerlich.
    Ich habe ein Grid und das Grid bekommt einen Hintergrund mit:

    <Grid Margin="0,0,0,0" x:Name="main_grid">
            <Grid.Background>
                <ImageBrush ImageSource="c:\myproject\images\background.png" Opacity="1.0"/>
            </Grid.Background>
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="Auto" MinHeight="11"/>
            </Grid.RowDefinitions>
            <custom:CoverFlowList 
                x:Name="CoverFlowList" 
                FrontContentTemplate="{DynamicResource FrontTemplate}" 
                BacksideContentTemplate="{DynamicResource BackTemplate}" />
        </Grid>
    

    Aber ich bekomme es leider nicht hin das ich im ImageSource einen relativen Pfad angebe 😞

    Folgendes habe ich versucht:
    \images\background.png
    images\background.png
    .\images\background.png
    background.png

    Kann mir hier jemand unter die Arme greifen und mir erklären wie ich das richtig schreiben muss?

    Grüße,
    thenoname



  • Geraten:

    Normalerweise werden die Programme unter " ./bin/Debug " bzw. " ./bin/Release " erstellt und ausgeführt.

    Also müsste der Pfad dann " ./../../images/Bildname.jpg " lauten.

    Jedoch solltest du diese Dateien als Resourcen einbinden und nicht als zusätzliche Dateien mitliefern.



  • Ich muss hier dem Benutzer die Chance geben das Bild auszutauschen.
    Ich habe nun auf dein Anraten den Versuch gemacht die exe in ein eigenes Verzeichniss zu kopieren und mit einem "images" Subfolder auszustatten.
    Als code dann:

    <ImageBrush ImageSource="./images/background.png" Opacity="1.0"/>
    

    leider ohne Erfolg.



  • Dein erster Ansatz ist schon ganz gut, aber hast du den images-folder deinem Projekt hinzugefügt(?)
    Also Verzeichnis im Projekt Ordner erstellen und die Bilder reinkopieren. Im Solution Explorer auf das Icon alle Dateien anzeigen klicken und
    dann rechtsklick auf das images-Verzeichnis und dem Projekt hinzufügen. Ggf. noch unter den properties von den Bildern,
    "Copy to Output Directory" auf "Copy always" oder "Copy if never" stellen und das ganze noch Rebuilden.



  • Ich habe die Komponente aus dem Explorer wie ein Benutzer aufgerufen.
    Dem Projekt hinzufügen? Da scheint mir was entgangen zu sein. Wenn ich es hinzufüge, dann ist das Bild als Resource eingebunden.
    Willst du damit sagen, man kann ein Bild als Resource einbinden trotzdem aber dann das Bild in der Laufzeit nach Belieben (Neustart der App vorausgesetzt) austauschen?
    Resource kenne ich nur als statisch eingebunden. Größe etc. ändert sich ja evtl.



  • Wenn du die die Bilder + Ordner nicht dem Projekt hinzufügst, müsstest du das Verzeichnis immer manuell in den Debug- oder Release-Folder reinkopieren. Sobald du die Bilder hinzugefügt hast, kannst du unter den Properties der Bilder das verhalten bestimmen. In deinem Fall bei „Build Action“ auf „None“ setzen, sonst werden diese tatsächlich beim kompilieren als Ressource eingebunden. Allerdings wirst du dein Vorhaben nicht nur mit XAML abfrühstücken können, um den Code-Behind wirst du nicht drum rum kommen.

    <Grid Name="gridBackgrd">
    <!-- weitere Elemente -->
    </Grid>
    
    ImageBrush imgBrush = new ImageBrush();
    imgBrush.ImageSource = new BitmapImage(new Uri(@"images\img_1.png", UriKind.Relative));
    
    gridBackgrd.Background = imgBrush;
    

    Dann könntest du das Bild auch austauschen und das ändern der Auflösung ect. spielt keine Rolle, es wird dann eben verzehrt dargestellt, solange du das nicht definierst. Nur in dem Beispiel müsste der Name konstant bleiben und der images-Folder würde im App-Verzeichnis liegen.

    Referenz:
    http://msdn.microsoft.com/en-us/library/system.windows.media.imagebrush.imagesource.aspx



  • Danke für den Code zum dynamischen Laden per C#, das werde ich jetzt wohl verwenden.
    Trotzdem sollte es in native xaml gehen und ich würde das gerne schaffen. Die Beispiele auf der MSDN sind in Bezug auf den imagebrush und dem Grid sehr eindeutig auf "myfolder/mypicture.jpg" ausgelegt. Also muss das genauso funktionieren. Der direkte Verweis mit "C:\myfolder\mypicture.jpg" funktioniert ja anstandslos, nur der relative Pfad geht nicht.

    Das Hinzufügen der Bilder habe ich nicht nach deiner Anleitung geschafft. Dank deutscher Version vermutlich. Der Solution Explorer ist wohl der Eigenschaften Manager, denn einen Solution Explorer kann ich so nicht finden. In den Eigenschaften kann ich alle Dateien anzeigen lassen, der image Ordner ist dort nicht vorhanden. Ich kopiere die Dateien momentan noch vorher als precompile in das jeweilige Vezeichnis (was auch funktioniert). Funktioniert auch ganz gut wenn man mit c# Code das Verzeichnis übergibt. Allerdings will ich ja xaml code direkt verwenden. Wie füge ich den Ordner mit Bildern korrekt hinzu?



  • Also auch das uri im C# code geht nicht relativ.

    ich musst das Ganze nun so umschreiben:

    var imageDir =
                        Path.Combine(
                            Path.GetDirectoryName(
                                Assembly.GetExecutingAssembly().Location),
                            "images");
    
                if (!Directory.Exists(imageDir)) return;
    
                var fileName = Path.Combine(imageDir, "Layout.jpg");
                if (!File.Exists(fileName)) return;
    
                ImageBrush imgBrush = new ImageBrush();
                imgBrush.ImageSource = new BitmapImage(new Uri(@fileName, UriKind.Relative));
    
                main_grid.Background = imgBrush;
    


  • Solution Explorer = Projektmappen-Explorer

    1. Möglichkeit
    Verzeichnis hinzufügen:
    Rechtsklick auf dein Projekt -> Hinzufügen -> Neues Verzeichnis

    Elemente (Bilder) hinzufügen:
    Rechtsklick auf (eben erstelltes) Verzeichnis -> Hinzufügen -> Vorhandenes Element

    2. Möglichkeit
    Wie schon beschrieben, Verzeichnis in Projekt-Order kopieren und im "Projektmappen-Explorer" (oben) auf das Icon "Alle Dateien anzeigen..." klicken usw.



  • var imageDir = ... den code kannst du dir sparen, du verwendest ja bereits UriKind.Relative - als Paramter 😉

    Referenz:
    http://msdn.microsoft.com/en-us/library/system.urikind(v=vs.110).aspx



  • Relativ geht bei mir nix, stürzt ab.
    Der Urikind ist noch falsch, hab ich jetzt auch geändert.


Anmelden zum Antworten