programmatisches Laden eines externen Bildes
-
Freitag, 25. November 2011 07:48
Ist es möglich ein Bild, dass im XAML angelegt wird und deren Source per C# gesetzt wird auch programmatisch "aufzurufen"?
Ich möchte eine neue Page per C# anlegen (ohne sie jemals anzuzeigen). Diese Seite existiert im XAML mit Code-Behind. Auf dieser Seite befindet sich ein Bild, dessen Quelle ich in der Code-Behind setze. Wenn ich mir nun ein neues Objekt der Page anlege, sollen auch sämtliche Bilder darauf geladen werden.
Der Hintergrund ist: Ich möchte diese Seite drucken, allerdings bereiten mir diese "dynamischen" Bilder Probleme. Wenn ich drucke, "erkennt Silverlight" das Bild nicht korrekt, sodass es zwar richtig gedruckt wird, aber der Inhalt, der darunter folgt verschiebt sich über den unteren Rand hinaus, sodass ich vermute, dass Silverlight irgendwie die Größe nicht richtig validiert. Kann mir jemand helfen?
- Bearbeitet Gozar15 Freitag, 25. November 2011 07:48 Schreibfehler
Alle Antworten
-
Freitag, 25. November 2011 08:07
Hi,
was meinst Du mit "programmatisch aufrufen"? Willst Du das Bild per Code in ein Image-Objekt laden?
Das geschilderte Problem dürfte aber IMHO nicht am Bild liegen, sondern eher an der Druckfunktion. Um da aber helfen zu können, müsste man erstmal wissen, was genau Du da auf welchem Weg druckst. Ggfs. liegt es auch am Druckertreiber, ...
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Freitag, 25. November 2011 08:42
Also ich habe zum Beispiel folgenden XAML Code:
<!--...--> <Grid Name="ContentGrid" Grid.Row="1"> <Grid.RowDefinitions> <RowDefinition Height="Auto"/> </Grid.RowDefinitions> <TextBlock Name="lbl2ndHead1" Style="{StaticResource SecondHeadlineStyle}" Text="TEXT" Grid.Row="0" /> <RichTextBox Name="rtbContent1" Style="{StaticResource ContentStyleRtb}" Grid.Row="0"> <Paragraph> <InlineUIContainer> <controls:ListItem/> </InlineUIContainer> TEXT </Paragraph> <Paragraph></Paragraph> <Paragraph> <InlineUIContainer> <HyperlinkButton Name="hyperFocalLength" Width="500" Style="{StaticResource PictureLinkContentStyle}"> <Image Name="img" Stretch="Uniform" Height="243" /> </HyperlinkButton> </InlineUIContainer> </Paragraph> <Paragraph></Paragraph> <Paragraph> <InlineUIContainer> <controls:ListItem/> </InlineUIContainer> TEXT </Paragraph> <Paragraph></Paragraph> <Paragraph> <InlineUIContainer> <controls:ListItem/> </InlineUIContainer> TEXT </Paragraph> <Paragraph></Paragraph> </RichTextBox> </Grid> <!--...-->
Der dazugehörige C# Code sieht wie folgt aus:
Ich setze also die Source des Bildes, das im XAML deklariert wird, im Code-Behind.public Page() { InitializeComponent(); BitmapImage bi = new BitmapImage(ResourceHandler.GetContentImageUri(Enums.ContentImageFolder.Basics, "img.png")); this.img.Source = bi; this.hyper.NavigateUri = ResourceHandler.GetContentImageUri(Enums.ContentImageFolder.Basics, "img.png"); }In der Druckfunktion erstelle ich mir nun ein neues Objekt der Page, also inklusive aller Elemente darauf.
Page selectedPage = (Page)((Frame)this.FindName(ResourceHandler.GetResource(App.ResControlNames, "FrameContent"))).Content;
Meine Druckfunktion sieht abgekürzt dann so aus:printablePage.Measure(availablePrintSize); //printablePage ist ein neues Objekt von selectedPage UIElement newChild = contentGrid.Children[itemIndex] as UIElement; //Ist das aktuelle Element, dass in den itemHost soll, der gedruckt wird UIElement newChildCopy; if (contentGrid.Children[itemIndex] is UserControl) { UserControl uc = contentGrid.Children[itemIndex] as UserControl; newChildCopy = PrintHelper.GetUserControl(uc.ToString()); } else { newChildCopy = newChild.Clone<UIElement>(); } contentGrid.Children.RemoveAt(itemIndex); //ParentGrid des zu druckenden Elements. Muss da raus und in den itemHost eingefügt werden newChild.Measure(availablePrintSize); //überflüssig? itemHost.Children.Add(newChild); itemHost.Measure(availablePrintSize); contentGrid.Children.Insert(itemIndex, newChildCopy); if (itemHost.DesiredSize.Height > pe.PrintableArea.Height && itemHost.Children.Count > 1) { itemHost.Children.RemoveAt(itemHost.Children.Count - 1); pe.HasMorePages = true; MessageBox.Show("Has more pages"); break; } printablePage = PrintHelper.GetContentPage(selectedPage.ToString()); itemIndex++;
Es muss an den Bildern liegen, da alle anderen Seiten einwandfrei funktionieren. Deshalb mutmaße ich, dass zum Zeitpunkt des Hinzufügens zum itemHost, das Bild noch nicht korrekt da ist. -
Freitag, 25. November 2011 09:05Beantworter
Es kann sein, dass das der Download des Bildes noch nicht abgeschlossen ist. Du kannst einen Eventhandler für das ImageOpened Event der BitmapImage Klasse erstellen um dieses sicherzustellen.
- Bearbeitet Marco PangritzEditor Freitag, 25. November 2011 09:05
-
Freitag, 25. November 2011 09:16Das wäre eine Idee, aber wie könnte man das umsetzen? Dann müsste ich praktisch immer schauen ob das neue Element ein Image ist und dann das ImageOpened event registrieren... oder?
-
Freitag, 25. November 2011 09:59Beantworter
Das wäre eine Idee, aber wie könnte man das umsetzen? Dann müsste ich praktisch immer schauen ob das neue Element ein Image ist und dann das ImageOpened event registrieren... oder?
Was genau meinst du damit, "neue Element"?
Hast du für jeden Druck eine eigene Page? -
Freitag, 25. November 2011 10:26
Nicht direkt. Ich erzeuge mir eine Kopie der angezeigten Seite. Diese drucke ich, da ich noch einige Anpassungen an der Seite vornehme, die sonst auf das Original Auswirkungen hätten.Hast du für jeden Druck eine eigene Page?
-
Montag, 28. November 2011 12:10Gibt es hier keine Möglichkeit? Oder müsste ich das Konzept überdenken?
-
Mittwoch, 7. Dezember 2011 09:01
Auch wenn ich die Source des Bildes im XAML bestimme und das Bild im Silverlight Projekt liegt, druckt er einfach nicht vernünftig aus.
<
Image Name="img1" Stretch="Uniform" Height="188" Source
="/PROJEKT;component/Resources/images/Winter.png" />
Bin ich denn der Einzige der druckt? :'(
-
Montag, 2. Januar 2012 16:49
Problem gefunden und ich würde behaupten, dass es ein Bug von Silverlight ist.
Silverlight druckt komplexe Objekte, wie Bilder und RichtTextBoxen (wie ich bisher feststellen durfte), innerhalb einer RTB nicht korrekt. Das wird vermutlich nicht korrekt interpretiert oder wie auch immer...
Lösung: Vermeiden von Bildern und RTB innerhalb einer RTB.
- Als Antwort markiert Gozar15 Montag, 2. Januar 2012 16:50

