Benutzer mit den meisten Antworten
RichTextBox per XamlReader einlesen

Frage
-
Ist es möglich einzelne Controls außerhalb der xap in ein XML zu packen und diese dann per XamlReader einzulesen?
Folgendes habe ich probiert:
public App() { this.Startup += this.Application_Startup; this.UnhandledException += this.Application_UnhandledException; InitializeComponent(); WebClient client = new WebClient(); client.OpenReadCompleted += new OpenReadCompletedEventHandler(client_OpenReadCompleted); client.OpenReadAsync(new Uri("http://localhost:10476/test/XMLFile1.xml", UriKind.RelativeOrAbsolute)); }
void client_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e) { if (e.Error == null) { RichTextBox rtb; using (System.IO.StreamReader reader = new System.IO.StreamReader(e.Result)) rtb = XamlReader.Load(reader.ReadToEnd()) as RichTextBox; } this.RootVisual = new MainPage(); }
Das XML sieht so aus:<RichTextBox Name="rtbContent1" Style="{StaticResource main_ContentStyleRtb}" Grid.Row="0"> <Paragraph> Test <Bold>Fett</Bold> </Paragraph> <Paragraph></Paragraph> <Paragraph> Möglichst immer <InlineUIContainer> <HyperlinkButton Style="{StaticResource main_LinkContentStyle}" Content="Normal" NavigateUri="/3Level/Basics" /> </InlineUIContainer> </Paragraph> <Paragraph></Paragraph> </RichTextBox>
Bei der Loadfunktion des XamlReader bekomme ich folgende Fehlermeldung:
Es wurde kein Standardnamespace deklariert.
Kann mir jemand sagen, ob es überhaupt möglich ist und wenn ja wie?
Mittwoch, 12. Oktober 2011 11:18
Antworten
-
Hallo Gozar,
ich habe dier hier mal eine funktionierende Lösung gebaut.
Der Container (Silverligth App) sieht bei mir wie folgt aus:
<UserControl x:Class="SLLoadXAML.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Text="Controls per XAML laden" /> <Button Content="jetzt Laden" Click="Button_Click" /> </StackPanel> <Border x:Name="placeholder" Grid.Row="1" Background="LightCyan" /> </Grid> </UserControl>
Der zugehörige Code:
using System; using System.Net; using System.Windows; using System.Windows.Controls; namespace SLLoadXAML { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { LoadXamlFromWeb(new Uri("/rtb.xml", UriKind.Relative), placeholder); } #region XAML Helper public static void LoadXamlFromWeb(Uri uri, Border targetObject) { WebClient wc = new WebClient(); wc.OpenReadCompleted += ((object sender, OpenReadCompletedEventArgs e) => { if (e.Error != null) { throw e.Error; } using (System.IO.Stream s = e.Result) { using (System.IO.StreamReader reader = new System.IO.StreamReader(s)) { targetObject.Child = (UIElement)System.Windows.Markup.XamlReader.Load(reader.ReadToEnd()); } } }); wc.OpenReadAsync(uri); } #endregion } }
Und hier noch das angepasste XAML aus deinem Posting.Ich habe die Datei auf meinem WebServer rtb.xml genannt, weil die Extension XAML bei manchen Serverkonfigurationen nicht heruntergeladen werden kann.
XAML (rtb.xml):
<RichTextBox xmlns='http://schemas.microsoft.com/client/2007' Name="rtbContent1" Grid.Row="0"> <Paragraph> Test <Bold>Fett</Bold> </Paragraph> <Paragraph></Paragraph> <Paragraph> Möglichst immer <InlineUIContainer> <HyperlinkButton Content="Normal" NavigateUri="/3Level/Basics" /> </InlineUIContainer> </Paragraph> <Paragraph></Paragraph> </RichTextBox>
Ich lade das gesamte Beispiel gerne auch hoch.Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und Usergroups- Als Antwort markiert Gozar15 Montag, 14. November 2011 16:22
Freitag, 11. November 2011 13:53
Alle Antworten
-
Hallo Gozar15,
Schau Dir mal die folgenden Links an. Vielleicht können sie Dir weiter helfen.
Reflecting on Silverlight's RichTextBox and it's XAML Export Problems
Silverlight Tip of the Day #60 – How to load a XAML Control From a File or String
Grüße,
Robert
- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 17. Oktober 2011 14:18
- Nicht als Antwort vorgeschlagen Gozar15 Montag, 24. Oktober 2011 10:16
Mittwoch, 12. Oktober 2011 15:06 -
Hallo Gozar,
ich weiß jetzt nicht ob dein Code so funktioniert, aber dein XAML muss glaube ich ein xmlns Attribut enthalten.
So in etwa:
<UserControl x:Name="uc1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und Usergroups- Als Antwort vorgeschlagen Robert Breitenhofer Montag, 17. Oktober 2011 14:18
- Nicht als Antwort vorgeschlagen Gozar15 Montag, 24. Oktober 2011 10:16
Montag, 17. Oktober 2011 11:52 -
Ja, statt des "UserControl" müsstest du "RichTextBox" drinn stehen haben.
Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und Usergroups- Als Antwort vorgeschlagen Olmic - Oliver Michalski Dienstag, 18. Oktober 2011 15:03
- Nicht als Antwort vorgeschlagen Gozar15 Montag, 24. Oktober 2011 10:16
Dienstag, 18. Oktober 2011 13:52 -
Wenn ich das mache, kommt folgender Fehler im Webprojekt:
Die Projektdatei muss die .NET Framework-Assembly "WindowsBase, PresentationCore, PresentationFramework" in der Verweisliste beinhalten. SilverlightApplication1Navi.Web
Der XAML Code:
<RichTextBox xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Name="rtbContent1" Style="{StaticResource main_ContentStyleRtb}" Grid.Row="0">
Dienstag, 18. Oktober 2011 15:29 -
Wenn ich in das xaml File gehe, kommen zusätzlich mehrere solcher Fehlermeldungen:
Die Document-Eigenschaft wurde mehr als einmal festgelegt. ..\visual studio 2010\Projects\SilverlightApplication1Navi\SilverlightApplication1Navi.Web\test\XMLFile1.xaml 9 3 SilverlightApplication1Navi.Web
Dienstag, 18. Oktober 2011 15:32 -
Hallo Gozar,
ich habe dier hier mal eine funktionierende Lösung gebaut.
Der Container (Silverligth App) sieht bei mir wie folgt aus:
<UserControl x:Class="SLLoadXAML.MainPage" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="400"> <Grid x:Name="LayoutRoot" Background="White"> <Grid.RowDefinitions> <RowDefinition Height="auto" /> <RowDefinition Height="*" /> </Grid.RowDefinitions> <StackPanel Grid.Row="0"> <TextBlock Text="Controls per XAML laden" /> <Button Content="jetzt Laden" Click="Button_Click" /> </StackPanel> <Border x:Name="placeholder" Grid.Row="1" Background="LightCyan" /> </Grid> </UserControl>
Der zugehörige Code:
using System; using System.Net; using System.Windows; using System.Windows.Controls; namespace SLLoadXAML { public partial class MainPage : UserControl { public MainPage() { InitializeComponent(); } private void Button_Click(object sender, RoutedEventArgs e) { LoadXamlFromWeb(new Uri("/rtb.xml", UriKind.Relative), placeholder); } #region XAML Helper public static void LoadXamlFromWeb(Uri uri, Border targetObject) { WebClient wc = new WebClient(); wc.OpenReadCompleted += ((object sender, OpenReadCompletedEventArgs e) => { if (e.Error != null) { throw e.Error; } using (System.IO.Stream s = e.Result) { using (System.IO.StreamReader reader = new System.IO.StreamReader(s)) { targetObject.Child = (UIElement)System.Windows.Markup.XamlReader.Load(reader.ReadToEnd()); } } }); wc.OpenReadAsync(uri); } #endregion } }
Und hier noch das angepasste XAML aus deinem Posting.Ich habe die Datei auf meinem WebServer rtb.xml genannt, weil die Extension XAML bei manchen Serverkonfigurationen nicht heruntergeladen werden kann.
XAML (rtb.xml):
<RichTextBox xmlns='http://schemas.microsoft.com/client/2007' Name="rtbContent1" Grid.Row="0"> <Paragraph> Test <Bold>Fett</Bold> </Paragraph> <Paragraph></Paragraph> <Paragraph> Möglichst immer <InlineUIContainer> <HyperlinkButton Content="Normal" NavigateUri="/3Level/Basics" /> </InlineUIContainer> </Paragraph> <Paragraph></Paragraph> </RichTextBox>
Ich lade das gesamte Beispiel gerne auch hoch.Daniel
http://www.silverlight-community.de - deutsche Community mit Tutorials, Blogs und Usergroups- Als Antwort markiert Gozar15 Montag, 14. November 2011 16:22
Freitag, 11. November 2011 13:53 -
Das funktioniert soweit schon mal. Allerdings war das Einlesen einer RTB nur der kleiner Schritt meines eigentlichen Vorhabens eine Page einzulesen, siehe hier:
Hast du dafür eventuell auch eine Lösung?
- Bearbeitet Robert Breitenhofer Montag, 14. November 2011 14:59 URL als Link
Montag, 14. November 2011 14:12 -
Hallo Gozar15,
Ich möchte Dich bitte folgendes lesen und die Beiträge die Dir geholfen haben zu bewerten.
Vielen Dank.
Nutzen Sie die Bewertungsfunktionen ("Antwort" und "Hilfreich") in den MSDN Foren! Unter anderem können andere später eine Lösung schneller finden. Es ist also wünschenswert, dass die fragenden (Benutzer) die Postings/Beiträge anderer Beantworter bewerten.
Hier dazu die wichtigsten Anhaltspunkte aus den Forenregeln und FAQs.
Lösungsbeiträge als „Die Antwort“ markieren
Bitte markieren Sie den Beitrag, der zur Lösung geführt hat, als "Die Antwort". Durch Bewerten eines Beitrags als "Die Antwort" können andere Teilnehmer die Lösung schneller finden. Außerdem können Sie dem Benutzer, der die Antwort eingereicht hat, für seinen Beitrag danken und zur Steigerung der Antwortqualität in der Diskussionsgruppe beitragen.
[Quelle: Forenregeln]
Wie bewerte ich einen Beitrag? Um einen Beitrag als hilfreich zu bewerten, klicken Sie in einem beliebigen Beitrag auf Als hilfreich bewerten. Sie können Ihre Stimme nur einmal für einen Beitrag abgeben.
[Quelle: Häufig gestellte Fragen]Grüße,
Robert
Montag, 14. November 2011 15:02