Laden...

Forenbeiträge von Levitas Ingesamt 95 Beiträge

27.12.2009 - 10:47 Uhr

Verwendetes Datenbanksystem: XML

Hallo Leute! Ich bin derzeit dabei eine, leider teilweise invalide XML einzulesen, und sie in eine valide Form umzuschreiben. Nun habe ich Probleme mit dieser XML, da sie CDATA-Abschnitte enthält, in der nicht einfache strings, sondern kombinationen von bytes abgespeichert werden.

Z.B. ein Abschnitt aus dieser XML, der den XmlReader in die Knie zwingt:


<m_Width>896</m_Width>
<m_Height>896</m_Height>
<m_Areas></m_Areas>
<WorldLightProfiles><North></North>
<South></South>
</WorldLightProfiles>
<BuildCounter>CDATA[      	   Ù  õ        õ  ]</BuildCounter>
<m_NetIsHost>0</m_NetIsHost>
<m_NetPlayers>0</m_NetPlayers>
<m_NetHostAdr></m_NetHostAdr>

Schaut man sich sich den Inhalt von CDATA im Hex-Editor an, steht da zwischen den []:
"1C 00 00 00 17 00 00 00 09 00 00 00 D9 07 00 00 F5 07 00 00 01 00 00 00 01 00 00 00 F5 07 00 00"

Nun habe ich mir eine eigene Methode zum Auslesen der wichtigen Teile geschrieben, z.B. brauche ich nur m_Width, m_Height, m_Areas und dann erst wieder alles ab m_NetIsHost. Es kommt später dann auch sehr oft vor, das ich größere Teile überspringen muss, deswegen mache ich das mit ReadToFollowing("");


        public static void WriteValue(string SourceName, string DestName, string AttributeName, XmlReader reader, XmlWriter writer)
        {
            writer.WriteStartElement(DestName);
            {
                reader.ReadToFollowing(SourceName);
                writer.WriteAttributeString(AttributeName, reader.ReadString());
            }
            writer.WriteEndElement();
        }

Dabei wird das ganze mit einem XmlWriter in die neue Xml geschrieben, ich denke mal der Code ist selbstverstänlich...

Mal angenommen, der Reader ist im moment bei <m_Areas>, und ich rufe ReadToFollowing("m_NetIsHost"); auf, so bekomme ich folgende XmlException:

"' ', hexidezimaler Wert 0x1C, ist ein ungültiges Zeichen. Zeile 9, Position 21."

Und Zeile 9, Position 21 in der Xml ist eben dieses 0x1C das ich oben an erster Stelle schrieb...

Nun, meine Frage: Was kann ich tun, um das zu vermeiden? 😦

Mfg Marc

19.12.2009 - 22:39 Uhr

Oh, sorry 😦

Habe überlesen, das das ganze in WPF gemacht wird 😦 (Besser gesagt nicht gelesen, in welchem Unterforum ich mich befinde) schäm

In WPF sollte das eigentlich gar nicht flackern... Oo

Jedenfalls DENKE ich, dass du es in WPF nicht besser machen können wirst, da WPF schon alles (diesbezüglich) per DirectX macht... So viel zu Optimierungen hust

Lg Marc

19.12.2009 - 13:17 Uhr

Setzte folgenden Code mal in den Konstruktor:

// Geschwindigkeiten optimieren
            SetStyle(ControlStyles.DoubleBuffer, true);
            SetStyle(ControlStyles.OptimizedDoubleBuffer, true);
            SetStyle(ControlStyles.CacheText, true);
            SetStyle(ControlStyles.AllPaintingInWmPaint, true);
            SetStyle(ControlStyles.UserPaint, true);

Lg Marc

27.11.2009 - 22:25 Uhr

Ich weiß es... Aber da habe ich das noch nicht gewusst... Das war damals mein erstes großes WPF-Projekt - Ich habe es eh "nur" dreimal von neu begonnen, und immer verbessert, verschönert, etc.

Wer will, kann sich's ja mal ansehen: Download

Copyright: Design wurde von www.anno1404-rechner.de nachgemacht. Ich möchte das hier keinesfalls als meine Idee ausgeben! Werte und Berechnung wurden jedenfalls selbst entwickelt und errechnet (Lösungsbuch)

Mfg Marc

27.11.2009 - 22:03 Uhr

Ok, danke für den Tipp, ich werde es mal versuchen 😃

Mfg Marc

PS: Das mit dem Konstruktor ist schon ok so... Ich weiß, dass es beim Laden dauert, aber das passt schon so, weil das eine Seite (UserControl) ist, die im Host angezeigt wird (das ganze Programm ist so ungefähr wie eine Homepage, die einzelne Seiten hat)

27.11.2009 - 20:47 Uhr

Hallo Leute!

Mich plagen derzeit die WPF Resources. Es geht dabei um eine Übersicht von ca. 700 kleinen png's die im Projekt in einem eigenen Ordner liegen. Es ist nun so, dass ich die ganzen Bilder in einem Panel anzeigen lassen möchte, wo schon mal alle Probleme beginnen... Derzeit ist es so, dass ich ein Dictionary generieren habe lassen, dass ich dann anschließend im Konstruktor einlese


List<string> keys = new List<string>();

            foreach (ResourceDictionary dict in App.Current.Resources.MergedDictionaries)
            {
                if (dict.Source.OriginalString.Contains("Fankit"))
                {
                    foreach (string key in dict.Keys)
                    {
                        keys.Add(key);
                    }
                }
            }

            keys.Sort(new Sorter());
            
            foreach (string key in keys)
            {
                ContextMenu menu = new ContextMenu();
                MenuItem item = new MenuItem { Header = "Dieses Icon speichern", Tag = key };
                item.Click += new RoutedEventHandler(item_Click);
                menu.Items.Add(item);
                Image image = new Image { Source = (ImageSource)FindResource(key), ContextMenu = menu, Margin = new Thickness(9) };
                panel.Children.Add(image);
            }

Das funktioniert schon ziemlich gut 😃

Problem: Ich weiß nicht, wie ich jetzt die Resource auf die Festplatte speichern kann 😦 Ich würde es gerne direkt aus dem Projekt-Ornder kopieren, sprich ich bräuchte die URI der ImageSource (Das Dictionary besteht nur aus ImageSources (<ImageSource x:Key="...">../Images/Fankit/...png</ImageSource>)), nur ich weiß nicht, wie ich das machen soll, und google hilft auch nicht wirklich weiter (ich google jetzt schon 1,5h -.-)

Ich hoffe ihr könnt mir helfen!
Großes Danke im Vorraus,
Mfg Marc

05.11.2009 - 21:23 Uhr

Hallo nochmal, und sry für den Doppelpost, aber ich habe jetzt die Lösung gefunden 😃


XmlWriter writer = XmlWriter.Create(Console.Out, new XmlWriterSettings { Indent = true });

            writer.WriteDocType("html", "-//W3C//DTD XHTML 1.0 Transitional//EN", "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd", null);
            writer.WriteStartElement("html", "http://www.w3.org/1999/xhtml");
            writer.WriteAttributeString("xml", "lang", "", "en");
            {
                writer.WriteStartElement("head");
                {
                    writer.WriteStartElement("title");
                    writer.WriteString("Das ist der Titel");
                    writer.WriteEndElement();
                    writer.WriteStartElement("style");
                    writer.WriteAttributeString("type", "text/css");
                    {
                        writer.WriteString("img { width: 150px; height: 150px; border: 1px; border-color: #000000; border-style: solid; }");
                    }
                    writer.WriteEndElement();
                }
                writer.WriteEndElement();
                writer.WriteStartElement("body");
                {

                }
                writer.WriteEndElement();
            }
            writer.WriteEndElement();

            writer.Close();

Nunja, das klappt nun endlich so. Bei Writer.WriteString verwende ich einfach HttpUtility.HtmlEncode, und anschließend manipuliere ich nur mehr die \r\n's per Regex. Es klappt un alles, wie ich will, und W3 sagt, das alles passt 😃

Danke nochmal an alle,
Mfg Marc

05.11.2009 - 19:58 Uhr

Hallo Leute!

Ich habe gerade die "perfekte" Lösung gefunden. Anfangs war mir das ganze mit dem HTML-Textwriter "etwas" zu kompliziert...

Naja, jetzt sieht das ganze etwas anders aus --> http://htmltextwriterutil.codeplex.com/

Ich werde das Tool hier jetzt einfach mal testen, ich denke aber, dass es hält, was es verspricht... 😃

Mfg Marc

03.11.2009 - 21:50 Uhr

Okay, ich kläre euch jetzt mal über das komplette Vorhaben auf (wäre vllt. besser gewesen, wen ich das schon früher gemacht hätte)

Das ganze ist für einen Kunden, es geht um ein Programm zur Verwaltung einer Foto-Galerie auf Basis von Slide.Show 2. Die eigentliche Homepage könnt ihr euch hier anschauen: http://www.wimex-san.at/

So, das klappt ja auch alles wunderbar, jedoch wollte der Kunde eine Möglichkeit, die Seite in reinem HTML darzustellen. Leider kommen in den Beschreibungen oft Zeilenumbrüche vor, könnt ihr euch ja angucken. Das ganze soll jetzt also 1:1 auf HTML übertragen werden, die alte Version von meinem Programm konnte das ja schon, jedoch seeeehr unsauber, und gar nicht schön. Vor allem bei Sonderzeichen, etc. Da kam immer irgendeine Krüppel-HTML raus (sry, aber es ist so^^)

Das hier ist die Nicht-Silverlight-Seite: http://www.wimex-san.at/Images/htmlslide.html ... So sollte das ganze aussehen, nur in der neuen Version von meinem Programm etwas schöner^^

Und da wären wir. Ich muss irgendwie eine sehr saubere HTML-Galerie rausbekommen, für Leute die kein Silverlight haben, bzw. keines installieren wollen. Dazu habe ich ja schon ein Konzept 😃

Ich hoffe, ihr versteht jetzt mein Problem, ich muss das mit den Zeilenumbrüchen einfach in den Griff bekommen, und das ganze soll als einfache Valid-Html rauskommen^^

Mfg Marc

PS:
Im Anhang ist ein Bild von meinem Programm 😃

03.11.2009 - 16:59 Uhr

Dafür habe ich derzeit keine Zeit... Ist eher dringend 😦

Lg Marc

03.11.2009 - 16:45 Uhr

Danke mal für die vielen Antworten, habe mir jetzt schon ziemlich viel davon angesehen 😃

Aber, mein Problem ist bisher eig. nur gewesen, dass der XmlWriter was anderes für sonderzeichen verwendet, als die codes, die man in HTML verwendet... Ich bin mir nicht sicher, was der XmlWriter alles (für meine Zwecke gesehen) falsch macht, aber er schreibt z.B. für ein \r\n ein "&#xD;&#xA;"... und das geht in HTML nicht. Das wäre ja nicht mal so das problem, ich könnte die datei nachher einfach noch mal parsen und manipulieren, ich bin mir aber nicht sicher, ob der writer sonst alles so macht, wie es für HTML vorgesehen ist. Wenn es nur die Zeilenumbrüche sind, die er "falsch" macht, dann kann ich damit leben. Aber wenn es einige Sachen sind, die anders sind...? Weiß dazu vllt. jemand mehr?

Mfg Marc

02.11.2009 - 23:16 Uhr

Ok, das klingt schonmal gut 😃 Was mir nur auffiel... an XHTML dachte ich bisher nicht ... Geht das denn mit einem XmlWriter genau so? Da kenne ich mich besser aus, als bei den documents.. 😃

Danke auf jeden Fall!

Mfg Marc

02.11.2009 - 00:26 Uhr

verwendetes Datenbanksystem: XML

Hallo Leute! Ich will eine HTML-Datei für spezielle Zwecke in meinem Programm generieren lassen. Das sollte aber ziemlich professionell sein, was man von einem HtmlTextWriter überhaupt nicht behaupten kann ... 😦
Deshalb wollte ich einen XmlWriter dazu "missbrauchen", habe jedoch kp, welche Lösung halbwegs akzeptabel ist, um mit einem XmlWriter ein Valid HTML - File mit Zeilenumbrüchen und Sonderzeichen in Attributen hinzubekommen.

Man könnte auf jeden Fall den ConformanceLevel auf Fragment stellen, aber das mit den NewLine-Characters...? &#xA;&#xD; ist auf jeden Fall nicht html^^

Ich hoffe, ihr könnt mir helfen...

Danke im Vorraus,
Mfg Marc

01.11.2009 - 22:27 Uhr

Habe das selbe Problem ... 😦

Hat denn niemand eine Lösung?

Mfg Marc

12.10.2009 - 22:04 Uhr

Versuchs mal mit dem ZIndex...

Sollte gehen mit:


Canvas.SetZIndex(highestControl, 1);

und für jedes andere nimmst du einfach


Canvas.SetZIndex(control, 0);

Mfg Marc

11.10.2009 - 17:48 Uhr

Wie wäre es mit "textBox.Text = (listBox.Items[listBox.SelectedIndex]).ToString();"?

Mfg Marc

14.09.2009 - 17:37 Uhr

@ tom-essen: Ich werde mal schauen, dass ich die Interfaces überarbeite, und das ganze programm offener hinlegen.

--> Dazu werde ich auch eine Dokumentation veröffentlichen, wie man an dem window sachen verändern kann. Z.b. dass man auf alle geladenen Add-Ins zugreifen kann, etc.

@der-schlingel: Ich schätze mal ja. Aber erst, wenn das ganze in einem halbwegs finalem Zustand ist.

Mfg Marc

14.09.2009 - 14:31 Uhr

Ich kann schon verstehen, dass das ganze nicht so ganz ankommt. Eigentlich wollte ich euch erst mal die Idee vorstellen, und eine kleine Beta-Version. Meine Idee würde so ungefähr in die Richtung gehen, dass sich so eine "Community" entwickelt, die Add-Ins programmiert, welche dann geshared werden.

Wenn der Community hier alleine diese Idee gefällt, würde ich versuchen das möglichst gut umzusetzen.

Falls ja, würde ich in Zukunft noch folgende Sachen einprogrammieren:

1.) Kommunizieren zwischen den Add-Ins ermöglichen.
2.) Gewisse Berechtigungen für Add-Ins hinzufügen bzw. entfernen (Größe ändern)
3.) Add-In struktur verbessern.
4.) Schnittstelle für Windows-forms-Usercontrols einprogrammieren (Diese werden anschließend per Windows-Forms-Host angezeigt)

Wenn jemand Wünsche/Fragen hat, kann er gerne hier posten.

Bezüglich der oben geschriebenen Sachen: Ich bräuchte dazu EURE meinung, z.B. wie es für euch am schönsten wäre, Add-Ins zu programmieren. Was ihr erwartet, was der Organizer können soll, etc.

Und: Organizer aus folgendem Grund: Sollte das ganze in Zukunft wirklich ankommen, würde ich Add-Ins programmieren, die jeder organizer können sollte. Z.B. einen mini-termin-kalender, eine weltuhr, oder was weiß ich. Vllt. auch ein kleines Browser-Add-In mit Back/Forward und Lesezeichen funktion. Wenn ich menie Zeit schon da reinstecke, würde ich mich freuen, wenn alle hier Teil werden, und ihren kleinen Beitrag dazu leisten. Ich würde, wie schon gesagt, eine Homepage einrichten, auf der man die Add-Ins sharen kann.

Mfg Marc

13.09.2009 - 22:02 Uhr

Ich habe wieder ein Add-In bekommen 😃

Vllt. hilft euch das mehr, das ist ja immerhin ein C-Sharp-Forum g

Der Autor hat mich gebeten, euch über einen bug zu informieren, der noch ausgebessert wird. Wenn man eine Datei öffnet, dann wird nur das erste Wort gehighlightet.

Aber ansonsten sollte es funktionieren. Add-In im Anhang

Mfg Marc

13.09.2009 - 18:00 Uhr

Ich habe gerade das erste Add-In von einem User bekommen, der aber (warum auch immer) anonym bleiben will.

Add-In ist im Anhang 😉

Mfg Marc

13.09.2009 - 17:34 Uhr

Hallo Leute!

Ich habe heute einen Mini-Organizer geschrieben... Wirklich Mini - denn er kann noch nichts. Ich hoffe, dass sich das ändern wird, da ich eine Add-In-Funktion eingebaut habe. Sprich, ihr könnt mich/das Projekt unterstützen, indem ihr Add-Ins für den Organizer programmiert.

Das ganze sieht so aus: Es gibt den Organizer, und eine dll, die ein Interface enthält. Ihr müsst nun eine dll erstellen, die eine (oder mehrere) klasse(n) enthält, die von diesem Interface abgeleitet wird. Die gebuildete dll wird nun in den selben Ordner wie der Organizer gelegt, und wird beim nächsten Start automatisch in einem TabControl als TabPage angezeigt. Ihr könnt in dem Add-In die Größe des Fensters, den Titel der TabPage, und natürlich das was auf der TabPage ist, bestimmen.

Mich würde erstmal interessieren, was ihr von dem Projekt haltet, bzw. ob es ankommt. Falls ja, werde ich den Organizer um einen Add-In-Manager (wie man ihn vom Reflector kennt) erweitern, und eine eigene Homepage für die Add-Ins einrichten.

Für die, die nun Interesse haben, können sich den Organizer mal runterladen, und mithilfe der Anleitung ihr eigenes Add-In erstellen.

In diesem Sinne, gutes Gelingen!

Mfg Marc

26.08.2009 - 13:55 Uhr

Naja... Das einzige was mich halt stört, ist, dass man dieses Opaque-Blend auch auf der Ellipse sieht... Siehe auf dem Bild oben. Man sieht diese Streifen vom Glass auch auf der Ellipse. Und das soll nicht so sein.

Mfg Marc

26.08.2009 - 13:42 Uhr

Ihr versteht anscheinend nicht, was ich will. Das mit den Ellipsen kommt einfach nicht hin. Wenn ihr euch das Foto mal genau ansehen würdet, würdet ihr sehen, dass es sich auf dem Foto im inneren Kreis nicht um eine einfache Ellipse handelt. Man sieht nämlich, dass die dwmapi dort nicht zeichnet.

Mfg Marc

26.08.2009 - 12:16 Uhr

Sorry, wegen "Wie poste ich richtig", aber... das habe ich ALLES schon versucht.

Ich bekomme es einfach nicht zusammen, zwei mal von der DwmAPI.dll rendern zu lassen. Die eine sollte eigentlich auf #00FFFFFF rendern, und die andere auf #F0FFFFFF. dann war nur ein weißter kreis zu sehen. Und beim schließen sah man kurz, das doch gerendert wurde... aber es wird nicht angezeigt =(

Mfg Marc

26.08.2009 - 11:07 Uhr

Dazu darf aber im inneren Kreis kein Windows-Aero sein UND dieser Bereich muss auch noch transparent sein... wie soll das denn gehen?

26.08.2009 - 09:43 Uhr

hmm... Es hat irgendwie nicht geklappt ....

Außerdem sieht man ja, dass Adam Nathan das anders gemacht hat (wie schon gesagt - die "lichtreflexionen")

Ist es irgendwie möglich die DwmAPI.dll in einem Fenster zweimal zu nutzen? Irgendwie hat das nicht so ganz geklappt =(

Mfg Marc

25.08.2009 - 21:30 Uhr

Ok, danke.

Es ging mir auch gar nicht um den Kreis. Eigentlich habe ich mir gar nicht vorgestellt, dass das so einfach ist. Man sieht ja auf dem Bild dass das recht speziell ist, da der kreis nichts mehr mit Windows Aero zu tun hat (siehe "Lichtreflexion")

Aber, die ersten Versuche sind schonmal nicht schlecht... (siehe Anhang)

Werde das noch verfeinern.... Wie gesagt: dachte nicht dass das so einfach ist... Ich habe Versuche in die richtung gemacht, die Farbe mithilfe der Aero-"Host"-Bereich klar gemacht wird, nur teilweise im fenster vorkommen zu lassen, aber das hat nicht geklappt. Habe viel zu kompliziert gedacht^^

Danke auf jeden Fall mal für diesen Tipp,

Mfg Marc

25.08.2009 - 21:13 Uhr

Das ist mir schon klar, aber mich würde interessieren, wie man sowas macht^^

Ich habe selber schon einiges versucht, nicht einmal in einem rechteck habe ich sowas hinbekommen (abgesehen ich ändere den Margin in meiner klasse fürs Glass)

Mfg Marc

25.08.2009 - 21:07 Uhr

Sorry, dass ich so undetailliert geschrieben habe. Es geht mir um diesen Kreis in der Mitte...

Mfg Marc

25.08.2009 - 20:47 Uhr

Hallo Leute!

Ich versuche derzeit so eine UI wie im Anhang hinzubekommen, aber ich finde einfach nichts dazu. (mehr details hier)

Weiß vllt. jemand, wie man so etwas hinbekommt?

Mfg Marc

14.08.2009 - 21:34 Uhr

Ok, danke

Ich finde mich bei den Downlads nur irgendwie nicht so ganz zurecht =/

Kann mir vllt. jemand sagen, was genau ich von hier brauche: Link?

Mfg Marc

14.08.2009 - 12:30 Uhr

Schade...

Ich sehe mal, was sich da noch machen lässt...

Danke erstmal an alle,

Mfg Marc

14.08.2009 - 11:52 Uhr

Verschlüsselung knacken oder das während der Programmausführung den RAM nach den Werten scannen.

Diese Werte wird man nicht so leicht finden, da sie nur bei einer methode übergeben werden, und nicht extra abgespeichert sind. Deshalb geht es mir auch nur um den Code.

Tja, da gibt es Firmen für, die sich auf sowas spezialisiert haben und sich damit auskennen. Soweit ich weiß, hat z.B. Aladdin auch extra Lösungen für .NET.

Ich finde zu "Aladdin" nicht viel in Google, genau so wenig bei "Alladin .Net", "alldin c#", etc.

Ein Link wäre hilfreich,

Mfg Marc

14.08.2009 - 11:01 Uhr

Ok, dann werde ich das mal lassen. Und wie sieht es mit meiner RAM-Idee aus? Würde sich das etwas bringen? ResourceHacker ist nattürlich eine Möglichkeit an die exe in den resources einer c++-anwendung zu kommen (denke ich zumindest mal...?)

Aber ich wüsste nicht, wie ich sowas umsetzen könnte...

Es ist nur so, dass in meinem Programm sehr viele wichtige Werte gespeichert sind, die niemanden etwas angehen...

Mfg Marc

14.08.2009 - 09:45 Uhr

Ich habe das Programm ja schon mit dem Dotfuscator behandelt, aber es ging nicht. Danach hieß es nur mehr "... funktioniert nicht mehr"

Kann das an WPF liegen? Ich habe die Dotfuscator Community Edition v 4.0.2008.11000

Ich sehe mich mal nach anderen Obfuscatoren um...

Mfg Marc

// Edit: Mit dem Phoenix Protector(http://ntcore.com/phoenix.php) bekomme ich bei der neuen exe wieder die gleiche Meldung =(

13.08.2009 - 23:08 Uhr

Das klingt schonmal gut, aber ich habe ein Problem dabei:

Meine Anwendung kann danach nicht mehr gestartet werden!?

Ich gebe die Anwendung einfach bei "Input Files dazu", drücke Strg+B, lass ihn das Projekt speichern, und sehe dan in den ordner "Dotfuscated" - Nun starte ich meine Anwendung, und es steht dort "... funktioniert nicht mehr"

Warum? Liegt das an WPF, oder wie?

Mfg Marc

13.08.2009 - 21:57 Uhr

Hallo Leute!

Ich suche derzeit nach einer Möglichkeit, eines meiner .Net-Programme zu schützen.

Eine Möglichkeit, die ich mir vorstelle, ist z.B. das programm als byte[] aus den ressourcen zu laden, in den ram zu schreiben, und anschließend aus dem ram zu starten, aber in einer unmanaged-sprache geschrieben, damit möglichst niemand was davon mitbekommt, was mit dem eigentlichen programm passiert.

Aber leider weiß ich nicht, wie ich sowas machen könnte...

Das Programm ist eine einzelne datei (aber 1,3MB groß), also, sollte es da doch mit meiner methode recht gut laufen?

Oder setze ich da völlig falsch an?

Ich hoffe, ihr könnt mir helfen!

Mfg Marc

09.08.2009 - 17:58 Uhr

Cooles tool!

Schon gezogen - Funktioniert prima! =)

Lg Marc

07.08.2009 - 20:51 Uhr

Danke SeeQuark, es hat jetzt geklappt!

Klasse:


        public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); } }
        public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); } }

        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(TooltipControl), new UIPropertyMetadata("", new PropertyChangedCallback(TitleChanged)));

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(TooltipControl), new UIPropertyMetadata("", new PropertyChangedCallback(TextChanged)));

        private static void TitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TooltipControl tooltip = ((TooltipControl)d);
            tooltip.HeaderBlock.Text = (string)e.NewValue;
            if (!tooltip.panel.Children.Contains(tooltip.HeaderBlock))
            {
                tooltip.panel.Children.Insert(0, tooltip.HeaderBlock);
            }
        }

        private static void TextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            TooltipControl tooltip = ((TooltipControl)d);
            tooltip.BodyBlock.Text = (string)e.NewValue;
            if (!tooltip.panel.Children.Contains(tooltip.BodyBlock))
            {
                tooltip.panel.Children.Insert(tooltip.panel.Children.Count == 1 ? 1 : 0, tooltip.BodyBlock);
            }
        }

        public TooltipControl()
        {
            Style = FindResource("SpecialTooltip") as Style;
            HeaderBlock.Foreground = FindResource("TooltipTitleColor") as Brush;
            BodyBlock.Foreground = FindResource("TooltipBodyColor") as Brush;

            this.Content = panel;
        }

Danke nochmal!

Mfg Marc

07.08.2009 - 20:11 Uhr

Hallo Leute!

Ich arbeite gerade an einem etwas größerem Projekt, und nutze deshalb auch eigene user-contols. Um darin mehrere Sprachen zu realisieren, habe ich drei Dictionaries mit denselben Keys, aber anderen Werten (String)

Z.b. so:


<!-- German.xaml -->
<s:String x:Key="deFische">Fische</s:String>
<!-- English.xaml -->
<s:String x:Key="deFische">Fish</s:String>
<!-- French.xaml -->
<s:String x:Key="deFische">Poisson</s:String>

Um die Sprache zu ändern füge ich dann einfach das Dictionary zu "App.Current.Resources.MergedDictionaries" hinzu (vllt. ist das nicht die beste methode, aber das bleibt so. Das ist auch gar nicht mein Problem)

Im XAML-Code rufe ich das dann z.B. so auf:
"Text="{DynamicResource deFische}""

Da bekam ich dann bei meiner Tooltip-Klasse
(


    public class TooltipControl : System.Windows.Controls.ToolTip
    {
        StackPanel panel = new StackPanel();
        TextBlock HeaderBlock = new TextBlock();
        TextBlock BodyBlock = new TextBlock();

        public string Title { get { return HeaderBlock.Text; } set { HeaderBlock.Text = value; AddHeader(); } }
        public string Text { get { return BodyBlock.Text; } set { BodyBlock.Text = value; AddText(); } }

        public TooltipControl()
        {
            Style = FindResource("SpecialTooltip") as Style;
            HeaderBlock.Foreground = FindResource("TooltipTitleColor") as Brush;
            BodyBlock.Foreground = FindResource("TooltipBodyColor") as Brush;

            this.Content = panel;
        }

        private void AddHeader()
        {
            panel.Children.Insert(0, HeaderBlock);
        }

        private void AddText()
        {
            panel.Children.Add(BodyBlock);
        }
    }

)
folgende Fehlermeldung:
""DynamicResourceExtension" kann nicht für die Eigenschaft "Text" vom Typ "TooltipControl" festgelegt werden. "DynamicResourceExtension" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden."

Gut, dann habe ich mir Dependency-Properties angelegt, sodass die Klasse so aussah:


    public class TooltipControl : System.Windows.Controls.ToolTip
    {
        StackPanel panel = new StackPanel();
        TextBlock HeaderBlock = new TextBlock();
        TextBlock BodyBlock = new TextBlock();

        public string Title { get { return (string)GetValue(TitleProperty); } set { SetValue(TitleProperty, value); HeaderBlock.Text = value; AddHeader(); } }
        public string Text { get { return (string)GetValue(TextProperty); } set { SetValue(TextProperty, value); BodyBlock.Text = value; AddText(); } }

        // Using a DependencyProperty as the backing store for Title.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(TooltipControl), new UIPropertyMetadata(""));

        // Using a DependencyProperty as the backing store for Text.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty TextProperty =
            DependencyProperty.Register("Text", typeof(string), typeof(TooltipControl), new UIPropertyMetadata(""));

        public TooltipControl()
        {
            Style = FindResource("SpecialTooltip") as Style;
            HeaderBlock.Foreground = FindResource("TooltipTitleColor") as Brush;
            BodyBlock.Foreground = FindResource("TooltipBodyColor") as Brush;

            this.Content = panel;
        }

        private void AddHeader()
        {
            panel.Children.Insert(0, HeaderBlock);
        }

        private void AddText()
        {
            panel.Children.Add(BodyBlock);
        }
    }

Aber jetzt werden keine Werte mehr übergeben. (Breakpoint auf den set-Accessor, bzw. sogar auf den get, und es passiert nichts)

Das Dictionary ist aber geladen, da die System.Windows-Controls alle ihre Werte drinnen stehen haben! Das ist nur bei meinen Controls nicht so....

Das Sprache-Wechseln funktioniert ebenso, nur in meinen controls stehen keine Werte.... =(

Kann mir jemand sagen, was ich falsch mache?

Mfg Marc

24.05.2009 - 19:53 Uhr

Und was muss ich da angeben? Eine Resource oder eine .resource-datei?

Und wie kann ich das dann nutzen?

Mfg Marc

24.05.2009 - 18:01 Uhr

Hallo Leute!

Ich habe ein kleines Problem damit, eine Art Installationsroutine zu erstellen (also, selber so eine Art Setup-Programm erstellen)...

Das mit dem Code ist gar kein Problem, ich muss es nur irgendwie schaffen, Ressourcen in die neue *.exe zu integrieren ... kann man das irgendwie machen?

Mein aktueller Code bisher (mit einer einfachen Win-Form):
Code:


using System; 
using System.Collections.Generic; 
using System.Text; 

using System.CodeDom.Compiler; 
using System.IO; 
using Microsoft.CSharp; 
using System.Reflection; 

namespace CodeCompiler 
{ 
    class Program 
    { 
        static string[] code = 
        { 
            "using System;"+ 
            "using System.Windows.Forms;"+ 
            ""+ 
            "namespace Test"+ 
            "{"+ 
            "    public partial class Form1 : Form"+ 
            "    {"+ 
            "        public Form1()"+ 
            "        {"+ 
            "            InitializeComponent();"+ 
            "        }"+ 
            "    }"+ 
            "    partial class Form1"+ 
            "    {"+ 
            "        private System.ComponentModel.IContainer components = null;"+ 
            "        protected override void Dispose(bool disposing)"+ 
            "        {"+ 
            "            if (disposing && (components != null))"+ 
            "            {"+ 
            "                components.Dispose();"+ 
            "            }"+ 
            "            base.Dispose(disposing);"+ 
            "        }"+ 
            "        private void InitializeComponent()"+ 
            "        {"+ 
            "            this.components = new System.ComponentModel.Container();"+ 
            "            this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;"+ 
            "            this.Text = \"Form1\";"+ 
            "        }"+ 
            "    }"+ 
            "    static class Program"+ 
            "    {"+ 
            "        [STAThread]"+ 
            "        static void Main()"+ 
            "        {"+ 
            "            Application.EnableVisualStyles();"+ 
            "            Application.SetCompatibleTextRenderingDefault(false);"+ 
            "            Application.Run(new Form1());"+ 
            "        }"+ 
            "    }"+ 
            "}" 
        }; 

        static void Main(string[] args) 
        { 
            CompileAndRun(code); 

            Console.ReadKey(); 
        } 

        static void CompileAndRun(string[] code) 
        { 
            CompilerParameters CompilerParams = new CompilerParameters(); 
            string outputDirectory = Directory.GetCurrentDirectory(); 

            CompilerParams.GenerateInMemory = false; 
            CompilerParams.OutputAssembly = "C:\\Test.exe"; 
            CompilerParams.TreatWarningsAsErrors = false; 
            CompilerParams.GenerateExecutable = true; 
            CompilerParams.CompilerOptions = "/optimize"; 

            string[] references = 
            { 
                "System.dll", 
                "System.Windows.Forms.dll", 
            }; 
            CompilerParams.ReferencedAssemblies.AddRange(references); 

            CSharpCodeProvider provider = new CSharpCodeProvider(); 
            CompilerResults compile = provider.CompileAssemblyFromSource(CompilerParams, code); 

            if (compile.Errors.HasErrors) 
            { 
                string text = "Compile error: "; 
                foreach (CompilerError ce in compile.Errors) 
                { 
                    text += "rn" + ce.ToString(); 
                } 
                throw new Exception(text); 
            } 
        } 
    } 
} 

Ich hoffe, ihr könnt mir helfen ...

Großes danke im vorraus,
Mfg Marc

23.04.2009 - 21:07 Uhr

Also, bei mir funzt es perfekt =) Echt cool was du da gemacht hast =)

Hab schon 'n bissl was erweitert, aber das funktioniert noch nicht so ganz^^
Was solls, ich werds schon zusammen bringen =)

Mfg Marc

22.03.2009 - 22:14 Uhr

Ich verwende einen edis-Server (www.edis.at)

Aber, ich habe jetzt gerade eine Methode entwickelt, die alle Dateien und Ordner (nicht rekursiv! nur die dateien udn ordner, die sich wirklich darin befinden) auflistet


        public List<string> GetImages(string folder)
        {
            List<string> Images = new List<string>();
            try
            {
                string uri = "ftp://" + ftpServerIP + "/" + folder;
                FtpWebRequest request = (FtpWebRequest)WebRequest.Create(uri);
                request.Method = WebRequestMethods.Ftp.ListDirectoryDetails;

                request.Credentials = new NetworkCredential(ftpUserID, ftpPassword);

                FtpWebResponse response = (FtpWebResponse)request.GetResponse();

                Stream responseStream = response.GetResponseStream();
                StreamReader reader = new StreamReader(responseStream);
                while (!reader.EndOfStream)
                {
                    string readedStream = reader.ReadLine();
                    string fileName;
                    List<string> SplittedStream = new List<string>();

                    foreach (string s in readedStream.Split(' '))
                    {
                        SplittedStream.Add(s);
                    }

                    fileName = SplittedStream[SplittedStream.Count - 1];

                    Images.Add(fileName);
                }

                reader.Close();
                response.Close();
                Console.ReadLine();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
            return Images;
        }

Mfg Marc

22.03.2009 - 18:41 Uhr

Hallo!

Ich würde gerne alle Dateipfäde von Dateien, die sich in einem Ordner befinden in einer string-Liste auflisten... Wie gesagt, von Dateien! In dem Ordner befinden sich nur Dateien, und keine Ordner...

Wie kann man das machen?

Mfg Marc