Laden...
Avatar #avatar-3402.jpg
7.e.Q myCSharp.de - Member
Student Mechatronik Scheeßel Dabei seit 06.10.2004 925 Beiträge
Benutzerbeschreibung

Forenbeiträge von 7.e.Q Ingesamt 925 Beiträge

31.01.2008 - 10:35 Uhr

Befindet sich der Namespace MeinNamespace eventuell in einem anderen Projekt innerhalb der Solution? Dann musst du das MeinNamespace-Projekt natürlich als Referenz in das Anwendungsprojekt einhängen.

27.01.2008 - 14:03 Uhr

Hi Leute,

hab testweise Silverlight 1.1 alpha bei mir installiert. Aber es will nicht laufen. In der Programme-Liste (Systemsteuerung) ist es eingetragen, aber weder der IE, noch der FF zeigt Silverlight Content an. Es heißt immer, ich müsse Silverlight installieren.

Silverlight 1.0 Content lief vorher, jedoch jetzt, nach der Installation von 1.1 alpha, auch nicht mehr.

Mein Betriebssystem ist Windows Vista Ultimate x86 (SP1 RC1).

Jemand 'ne Idee, wo ich nachschauen könnte, woran's liegt?

Grüße,
Hendrik

26.01.2008 - 11:22 Uhr

Du solltest auch hier wie immer DataBinding verwenden. Ich hab gelernt, in WPF lässt sich eine Hierarchie in einem TreeView perfekt abbilden, indem man sie in C# genau so programmiert, wie man sie im Baum gern hätte.

Du hast also beispielsweise eine Klasse "BaumWurzel". Diese Klasse ist abgeleitet von ObservableCollection<Stamm>. Desweiteren hast du eine Klasse "Stamm", die wiederum abgeleitet ist von ObservableCollection<Ast>. Noch weiter hast du eine Klasse namens Ast, die ihrerseits abgeleitet ist von ObservableCollection<Blatt>. Und zu guter Letzt eine Klasse namens "Blatt", die abgeleitet ist von DependencyObject oder die das INotifyPropertyChanged Interface implementiert.

Diese Hierarchie kannst du mithilfe von HierarchicalDataTemplates in XAML optisch auf deine Bedürfnisse anpassen. Der Baum wird später genau so aussehen, wie die Klassen es beschreiben. Weist du dem TreeView als ItemsSource ein gefülltes Objekt vom Typ BaumWurzel zu, wird die WPF den ganzen Baum anhand des Inhalts der BaumWurzel Collection aufbauen.

Soviel zur Grundlage.

Um nun zu erreichen, daß bei jeder Änderung einer TextBox/ComboBox ein neues Item eingefügt wird, brauchst du es nur im entsprechenden Event der TextBox/ComboBox in die jeweilige Collection der gewünschten Ebene einfügen. WPF macht den Rest.

25.01.2008 - 14:35 Uhr

Das mag sein. Aber... aber... aber es ging doch um die Optimierung obiger Funktion... Ach man... ich wollt doch auch mal! 😜 😜 😜

25.01.2008 - 14:28 Uhr

Du kannst auch sowas machen..


        public string GetValueA(string Property, int Index)
        {
            if (Values.Count <= Index) return "false";

            Regex tRgx = new Regex(String.Format("{0}=(?<value>.*?);", Property));

            string tLines = String.Join(";", Values[Index]);
            MatchCollection tMatches = tRgx.Matches(tLines);
            if (tMatches.Count > 0)
            {
                return tMatches[0].Groups["value"].Value;
            }

            return "false";
        }

Ist das schneller?

25.01.2008 - 14:12 Uhr

Und reguläre Ausdrücke? Verlangsamen die das?

25.01.2008 - 13:51 Uhr

Erstmal ist es quatsch, zwei mal zu prüfen, ob sLine mit sValue beginnt.


                    if (sLine.StartsWith(sValue)) // Blödsinn
                    {
                      if (sLine.StartsWith(sValue + "=")) // Reicht doch völlig.
                      {
                          return sLine.Remove(0,sValue.Length+1);
                      }
                    }

So, für's erste, was mir auf Anhieb einfiel... mal sehen, was mir noch einfällt.

25.01.2008 - 10:54 Uhr

In WPF ist es allerdings empfehlenswert, die Übergabe der Werte einer Instanz an ein GUI Element NICHT über C# Code zu machen, sondern so weit wie möglich über Data Binding. Genau dafür ist es schließlich vorgesehen.

25.01.2008 - 02:07 Uhr

Ihr habt komische Probleme... weird

17.01.2008 - 17:21 Uhr

Werd ich vielleicht auch nochmal ausprobieren. Ist ja evtl. besser, als meine aktuelle Lösung:

Ich hab jetzt jedem Element der Liste eine Previous Property gegeben. Die Properties werden im PropertyChanged-Event der Liste gesetzt. Dazu durchlaufe ich den View, den ich auf die ListBox gelegt habe (damit ich die Reihenfolge wie in der Ansicht habe und nicht wie in der Collection), weise jedem "Posting"-Objekt als "Previous" das vorhergehende zu.

Darüber hinaus hat jedes Posting-Objekt eine "Sum"-Property, die die Summe aus Previous.Sum + this.Value zurückliefert.

Das einzig zeitaufwändige dabei ist halt das durchlaufen des Views zwecks Zuweisung der Previous-Objekte.

Schöner wär's natürlich gewesen, das ganze völlig ohne CodeBehind zu machen... aber das ist wohl utopisch. 🤔

17.01.2008 - 14:29 Uhr

Hi Leute,

ich hab 'ne Herausforderung*...

Ich habe eine ListBox, die mir einen Haufen Items eines bestimmten Typs "Posting" anzeigt - gebunden über eine ObservableCollection. "Posting" hat eine Property "Value". Ich möchte nun, daß in jedem ListBoxItem am Ende ein Label liegt (über's Template ja kein Ding), das - Achtung! - die Summe aller vorhergehenden "Values" enthält.


ListItem1 Value: 5   Summe: 0
ListItem2 Value: 5   Summe: 5
ListItem3 Value: 3   Summe: 10
ListItem4 Value: -4  Summe: 13
ListItem5 Value: 0   Summe: 9
ListItem6 Value: -10 Summe: 9
ListItem7 Value: 0   Summe: -1
.
.
.

... und so weiter.

Wie realisiert man sowas?

Danke!

Grüße,
Hendrik

* = es gibt keine Probleme, nur Herausforderungen

15.01.2008 - 10:57 Uhr

Setz mal im Code probeweise die Opacity von brush auf 1.0 oder kommentier die Zeile, die die Opacity auf 0.5 setzt, ganz aus. Ruckelt's dann immer noch?

14.01.2008 - 17:46 Uhr

Kann es sein, daß das daran liegt, daß da zwei Transparenz-Kanäle übereinander liegen? Wenn du Background vom Canvas nicht definierst, ist es doch standardmäßig "Transparent", oder? Und das m_OverlayElement hat als brush einen VisualBrush vom m_OriginalElement mit einer Opacity von 0.5. Also zwei Transparenzkanäle übereinander...

... liegt's evtl. daran?

13.01.2008 - 18:41 Uhr

Wenn nur die Texte und Werte innerhalb der Prozentzeichen extrahiert werden sollen, versuch's mal damit:


(?<text>%.*?((?<value>:.*?%)|%))

Und dann die resultierende MatchCollection durchgehen.

... wie gesagt, nur sofern der Text außerhalb der %% irrelevant ist.

edit: errrrr muss ich noch dran arbeiten... moment...

edit: soo... jetzt sollte es funktionieren.

10.01.2008 - 17:25 Uhr

Okay!

Team Suite unter Vista Ultimate. Keine Probleme. Läuft alles sauber. Bissl instabil stellenweise, aber bekannte Fehler, die MS im nächsten Update für VS behebt.

10.01.2008 - 17:10 Uhr

Kein Ding...

Nur ein gut gemeinter Rat: bisschen Wut ist gut für's Blut, mag sein, aber tief einatmen und erstmal 'nen klaren Kopf kriegen, bevor man ein Posting verfasst, auch.

Nichts für ungut! 8)

10.01.2008 - 16:58 Uhr

Schonmal den Kompatibilitätsmodus probiert?

06.01.2008 - 23:20 Uhr

Nicht ganz die Antwort auf deine Frage, aber benutz doch PNG Dateien mit Alpha-Kanal und transparentem Hintergrund für die Bildchen auf den Buttons. Das sieht dann in jedem Theme zumindest optisch passend aus.

05.01.2008 - 12:09 Uhr

Das mal cool! Sehe ich das richtig, daß das Window nicht direkt IM Control gerendert, sondern nur darübergelegt wird?

edit: hmm... anscheinend wird das tatsächlich ein Child Element des MainForms, oder?

03.01.2008 - 18:28 Uhr

Uahhh... ein Captain Obvious und ich seh den nicht... kopf->tisch ARGH! duck wegrenn

03.01.2008 - 14:54 Uhr

Danke! Du müsstest da doch mit dem Debugger und F11 durchsteppen können... wo steigt er denn aus, bzw. ab wo macht er nicht mehr, was er machen soll?

edit: mach mal 'n Haltepunkt in bt_ServerDisable_Click beim Aufruf von Trennen().

03.01.2008 - 14:40 Uhr

Vielleicht könntest du ja mal die kompletten Sourcen hier posten (evtl. als ZIP Archiv). Dann könnte sich derer mal jemand genauer annehmen.

03.01.2008 - 14:31 Uhr

Ja, aber nur wenn ich den Button vom UserControl betätige und nicht von außerhalb.

Der EventHandler wird erst eingehängt, wenn du den Button drückst?


s.evh_Trennen += new EventHandler(s_Trennen);

Das passiert erst auf das Click-Event des Buttons hin?

03.01.2008 - 14:30 Uhr

das ich die sehv_trennen methode im code nicht sehen, darn liegts nicht oder?

uh... sauberes Deutsch scnr

ehv_Trennen ist ein Event, schau nochmal genau hin!

03.01.2008 - 14:23 Uhr

Bist du sicher, daß der Code, der den EventHandler im UserControl einhängt, tatsächlich ausgeführt wird?

03.01.2008 - 14:17 Uhr

Führst du denn im Click-Event des Buttons auch SuperCom.Trennen() aus?

03.01.2008 - 14:09 Uhr

Versuchst du, das Event von außerhalb der Klasse, zu der es gehört, auszulösen?

03.01.2008 - 13:40 Uhr

Stichwort "Dispatcher.Invoke". Du musst die Änderung der Source-Property an den GUI Thread zurückgeben.

29.12.2007 - 18:08 Uhr

😉 😁 Kein Problem!

29.12.2007 - 10:32 Uhr

(?<Spielername>.+?)(showed|grabbed)

Das müsste gehen.

27.12.2007 - 14:09 Uhr

Das stimmt. Also da ich einen Wertebereich von Min bis Max habe, hab ich diesen in einer for-Schleife abgedeckt. Ich habe dazu auch noch einen Winkel von -135° bis +135° (0° ist Zeigerstellung senkrecht nach oben - ohne zweideutig sein zu wollen). Ich habe also den Wertebereich von Min bis Max (bspw 0 - 100) auf den Winkelbereich umgerechnet (einfacher Dreisatz). Danach hab ich noch 135 vom Ergebnis abgezogen, um eben nicht 0° - 270°, sondern -135° - +135° zu bekommen. Dadurch hatte ich einen Rotationswinkel. Den habe ich einer RotateTransform Instanz zugewiesen. Dann habe ich in der Mitte des Controls (also an Position 0°) an den entsprechenden Koordinaten eine Line Shape erstellt, ihr den RotateTransform als RenderTransform zugewiesen und die Line an die Children-Collection eines Grid-Elements angehängt. Und das ganze immer wieder, bis alle Linien erstellt waren.

Um die Linien unterschiedlich groß aussehen zu lassen, hab ich einfach überprüft, ob sich der Schleifenzähler durch 5, durch 10 oder durch 20 zählen lässt und entsprechend die Werte gesetzt (mit dem Modulo-Operator geht das gut; einfach schauen, ob das Ergebnis aus Zähler % 20 == 0 ist; für die, die's noch nicht kennen).

Die Zahlen hab ich auf ähnliche Weise platziert. Allerdings nicht mit einem RotateTransform, sondern mit einem TranslateTransform, dem ich als Punkt den transformierten Endpunkt der Ursprungs-Linie gegeben habe (auf Y-Achse minus 10, um die Ziffern ein Stück weiter außen zu platzieren). Und auch da hab ich die Ziffern immer nur erstellt, wenn sich der Schleifenzähler durch 20 teilen lässt (bzw. wenn der erste oder der letzte Schleifendurchlauf erreicht ist, um auch am Anfang und am Ende Ziffern zu haben).

Funktioniert gut. Sieht im Code allerdings reichlich wirr aus:


        private void RenderTicks()
        {
            if (Ticks == null) return; // Falls die Ticks gezeichnet werden sollen, bevor "Ticks" überhaupt existiert 
            // "Ticks" ist das Grid-Control, das die Tickmarks und die Ziffern bekommt.

            Ticks.Children.Clear();

            for (double i = mMin; i <= mMax; i++)
            {
                // mOverallAngle hat den Wert 270.0F; das werde ich noch in einer Property exportieren
                double tAngle = ((mOverallAngle / (mMax - mMin)) * i) - (mOverallAngle / 2);

                // 150.0F, 150.0F ist der Mittelpunkt der gesamten Control (300.0F x 300.0F)
                RotateTransform tTransform = new RotateTransform(tAngle, 150.0F, 150.0F);  // ... und Transformieren der aktuellen Tickmark
            

                TextBlock tBlock = new TextBlock(); // Textblock für die aktuelle Ziffer
                tBlock.Text = String.Format("{0}", i);

                Point tLinePos = tTransform.Transform(new Point(150.0F, 30.0F)); // Position für die aktuelle Ziffer, transformiert zur aktuellen Tickmark
                Size tSize = CalculateTextSize(tBlock.Text, tBlock.FontSize); // Größe berechnen, um Mittelpunkt der Ziffer zu erhalten
                TranslateTransform tMoveScale = new TranslateTransform();
                tMoveScale.X = tLinePos.X - (tSize.Width / 2);
                tMoveScale.Y = tLinePos.Y - (tSize.Height / 2);

                tBlock.RenderTransform = tMoveScale;
                tBlock.Foreground = Foreground;
                tBlock.FontWeight = FontWeight;

                Line tLine = new Line();

                if ((i % 20 == 0 && (mMax - i) > 10) || i == mMax)
                {
                    tLine.Y1 = 50.0F;
                    tLine.Y2 = 40.0F;
                    tLine.StrokeThickness = 3;

                    Ticks.Children.Add(tBlock);
                }
                else if (i % 10 == 0)
                {
                    tLine.Y1 = 50.0F;
                    tLine.Y2 = 40.0F;
                    tLine.StrokeThickness = 1;
                }
                else if (i % 5 == 0)
                {
                    tLine.Y1 = 50.0F;
                    tLine.Y2 = 45.0F;
                    tLine.StrokeThickness = 1;
                }
                else
                {
                    tLine.Y1 = 50.0F;
                    tLine.Y2 = 48.0F;
                    tLine.StrokeThickness = 1;
                }

                tLine.Stroke = Brushes.White;
                tLine.X1 = 150.0F;
                tLine.X2 = 150.0F;
                tLine.RenderTransform = tTransform;

                Ticks.Children.Add(tLine);
            }
        }

        private Size CalculateTextSize(string tString, double tFontSize)
        {
            Typeface tFace = new Typeface(FontFamily, FontStyle, FontWeight, FontStretch);
            FormattedText tText = new FormattedText(tString, CultureInfo.CurrentCulture, FlowDirection.LeftToRight, tFace, tFontSize, Foreground);
            Size tSize = new Size(tText.Width, tText.Height);
            return tSize;
        }


Man kann da sicherlich noch einiges verbessern (falls ja, was zum Beispiel?). Aber es funktioniert so schonmal sehr gut.

27.12.2007 - 03:29 Uhr

Harr! Hab's hinbekommen. 🙂

26.12.2007 - 12:44 Uhr

Hmm, gut, das mit den DependencyProperties ist klar.

Aber ich hab das mit Geometry und so noch nicht begriffen. Wie kriege ich es damit hin, eine vernünftige Skala auf dem Ziffernblatt zu kreieren?

Probleme macht mir auch das ArcSegment. Ich find das blöd mit den Start- und Endpunkten und dem Radius. Dadurch ist es - nach meinem eingerosteten mathematischen Verständnis - unheimlich schwer, einen exakten Mittelpunkt des Kreissegments festzulegen. Ich möchte doch nur einen Kreis haben, der exakt zentriert in dem Control sitzt und dem im unteren Teil ein definiertes Stück fehlt (welches dann durch ein weiteres ArcSegment aufgefüllt wird - siehe Screenshot). Ich mein, gut, das funktioniert so auch, aber der Kreis lässt sich nicht so schön sauber zentriert ausrichten. Ich hab das jetzt durch probieren nach Augenmaß hingeschoben...

26.12.2007 - 03:57 Uhr

Schick... Ich arbeite dran.

Mir fehlt nun noch die Skala... (anderer Thread). Das kriege ich noch nicht hin.

26.12.2007 - 02:08 Uhr

Also mit HandoffBehavior.Compose sieht das gut aus. Aber warum mit relativen Werten, statt mit absoluten? Mit absoluten Werten funktioniert's soweit ganz gut.

25.12.2007 - 20:43 Uhr

Hi Leute,

wie zeichne ich in WPF eine Skala (Ticks) für ein Rundinstrument (Tachometer) mit einem Anfangs- und einem Endwert (bspw. 0 - 280) und großen Ticks in definierten Abständen (0, 20, 40, 60, 80, ..., 260, 280), sowie kleinen Ticks dazwischen (5, 10, 15, 25, 30, 35...)?

Ich vermute, dafür ist die OnRender Methode des vererbten UserControls zu überschreiben. Aber wie zeichne ich dann die Ticks da drin?

Desweiteren... wie sorge ich dafür, daß bei einer Änderung von "Min" (bspw. 0) und "Max" (bspw. 280) des UserControls die Skala neu gezeichnet wird?

Grüße, Hendrik

25.12.2007 - 20:38 Uhr

Stimmt. Sieht gut aus. 🙂

Nun fehlt mir noch 'ne Möglichkeit, bei einer Änderung des "Value" des Controls, welche eine Richtungsänderung des Zeigers zur Folge hätte, die laufende Animation nicht zu unterbrechen, was zu einer abrupten Richtungsänderung des Zeigers führt, sondern den Zeiger quasi entsprechend seiner simulierten "Masse" zu bremsen und gleichermaßen in die andere Richtung zu beschleunigen.Oder, falls der neue Wert in der gleichen Richtung liegt, wie der aktuell anzusteuernde, die Bewegung des Zeigers nicht zu unterbrechen, sondern der Animation einfach "im laufenden Betrieb" den neuen Zielwert zuzuweisen.

Ideen?

25.12.2007 - 18:22 Uhr

Aber "natürlich" ist dieses Verhalten nicht gg
Solche analogen Zeiger werden ja mit ner Feder zurückgestellt und das ist so dimensioniert das die im aperiodischen Grenzfall zurückschwingt, da man gerade so ein Verhalten wie du beschreibst nicht will 😉

Gut, das kann man sehen, wie man will. Ob's dem natürlichen Verhalten eines Zeigers entspricht oder nicht, ist für meine Experimentierfreude egal. Sicher, das natürliche Verhalten eines Zeigers in einem Messinstrument wäre eine sanfte Verzögerung hin zum Zielpunkt. Mir geht's aber in erster Linie einfach um's "Machen". Beispielsweise der Sekundenzeiger auf der Vista Sidebar Uhr weist ein ähnliches Verhalten auf. Der schwingt auch erst ein Stückchen zu weit, um dann im richtigen Moment zur "angesteuerten" Sekunde zurück zu drehen... Wie auch immer...

... es funktioniert jedenfalls, wie ich es mir vorstelle. 🙂

Interessant wäre ein wirklich "natürliches" Verhalten aber auch noch. Also wie würde man das denn realisieren? Was müsste ich tun, um ein solch sanftes Ausdrehen des Zeigers zu erhalten?

25.12.2007 - 17:33 Uhr

Ahhh... mit dem Completed-Event von DoubleAnimation funktioniert das gut. Einfach den Zeiger in der ersten Animation etwas weiter fahren, als zum Zielpunkt und erst im Completed-Event mit einer neuen DoubleAnimation an den gewünschten Zielpunkt zurück fahren. Sieht gut aus. 🙂

25.12.2007 - 17:17 Uhr

Okay, danke, das funktioniert soweit schon ganz klasse. Was mich jetzt interessieren würde... wie erreiche ich damit eine "natürliche" Bewegung eines Zeigers? Ich meine die Beschleunigung und die Verzögerung samt Trägheit (also dieses "über das Ziel hinausschießen" und das Einpendeln auf den Zielwert)?

Jemand 'ne Idee?

24.12.2007 - 15:05 Uhr

Wenn MicroSofts XBox360 die PhysX PPU integriert hat, dann kann es doch auch durchaus sein, daß DirectX 10 bestimmte Algorithmen auf die PhysX Karte auslagert. "Entsprechende Vereinbarungen wurden mit Ageia getroffen". Spricht also nichts dagegen, daß dem so ist...

Wer weiß es genau?

23.12.2007 - 14:21 Uhr

Hi,

...generft...Vortschritte

*hust* 👍

Sorry, den konnte ich mir nicht verkneifen.

Ich entwickle seit 7 Jahren Software in einem namhaften Unternehmen. Meine Sprachen sind dort C/C++ und C#.

Ich freue mich, wenn ich jemandem etwas erklären kann. Allerdings nur dann, wenn ich nicht gerade selber mit etwas beschäftigt bin, bzw. - was noch gravierender ist - wenn ich gerade selber versuche, etwas zu verstehen (ein neues Design Pattern lerne oder eine mir unbekannte Klasse kennenlernen will). Wenn dann jemand neben mir sitzt, der dauernd fragt, was ich da tue und wie das geht und hier und da, dann bin ich schon recht schnell genervt.

23.12.2007 - 12:17 Uhr

Du müsstest doch von ListView ableiten können, oder? Dann müsstest du darin doch die OnKeyDown, OnKeyPressed und/oder OnKeyUp Methoden überladen und damit ausblenden können, oder? Das müsste m.E. diesen Mechanismus deaktivieren...

Falls du die Events KeyUp, KeyPressed und KeyDown dann doch brauchst, musst du sie eben manuell in deinen überladenen Methoden feuern lassen.

Müsste THEORETISCH funktionieren. Ausprobiert hab ich's jetzt auf die schnelle nicht...

23.12.2007 - 12:12 Uhr

Hi Leute,

ich hab gerade schon wieder so'n Geistesblitz. Wie erreicht man in WPF, daß die Änderung beispielsweise einer Property "Value" in einem als analoge Zeigeranzeige (Tachometer, Aussteuerungsanzeige etc.) konzipierten Control nicht in einer sprunghaften Positionsänderung des Zeigers, sondern sauber animiert dargestellt wird? Der Zeiger soll also flüssig (evtl. easeIn und easeOut) vom alten zum neuen Wert "wandern".

Wie macht man sowas?

Danke!

Grüße,
Hendrik

20.12.2007 - 09:51 Uhr

Hi Leute,

ich hatte da gerade so 'ne schräge Idee: ist es möglich, das MainWindow eines Child-Prozesses einer WPF Anwendung in einem Control (evtl. als Content) zu hosten?

Rein der Machbarkeit wegen, erstmal ohne Sinn dahinter...

Grüße,
Hendrik

19.12.2007 - 08:40 Uhr

Darum meide ich Apple... 🙄

18.12.2007 - 12:53 Uhr

Hört sich so an, als müsste das Objekt, das du als DataContext übergibst, das Interface INotifyPropertyChanged implementieren. Und bei Änderung des Textes musst du dann das entsprechende Event (PropertyChanged) feuern lassen.

06.12.2007 - 23:30 Uhr

RapierLoom arbeitet mit Attributen.

06.12.2007 - 22:36 Uhr

Schau dir mal AOP an; speziell das Rapier-Loom Framework, welches ich diesbezüglich sehr interessant finde.

06.12.2007 - 18:16 Uhr

Das dürfte hinkommen... So viele Lösungen zu den Problemen der Menschheit, wie ein 7bit langer Hashwert Kollisionen zulässt.