Laden...
Avatar #avatar-2500.jpg
Feroc myCSharp.de - Member
Anwendungsentwickler Dabei seit 13.12.2007 55 Beiträge
Benutzerbeschreibung

Forenbeiträge von Feroc Ingesamt 55 Beiträge

04.03.2009 - 16:30 Uhr

Ja, ich bin mir ziemlich sicher, dass die Versionsnummer vom 7zip sfx nicht mehr als Kosmetik ist. 😃

Der Dateiname ist fix, die Version soll in die entsprechenden Felder.

04.03.2009 - 15:54 Uhr

Moin,

ich hab hier ein kleines Problem und konnte bisher nichts brauchbares finden.

Das Problem:
Wir haben hier ein Programm und der Installer davon wird am Ende zu einem 7zip self extracting zusammen geschraubt. Dieses self extracting hat nun aber die Version von 7zip und nicht von unserem Programm.

Diese Version würde ich jetzt gerne nachträglich und automatisiert ändern. Dafür würde ich mir gerne eine kleine Consolenanwendung schreiben.

Jemand eine Idee oder einen Stichpunkt der mir helfen könnte?

19.02.2009 - 13:06 Uhr

Danke, dann versuche ich es mal damit. 😃

Das WPF Beispiel funktioniert bei mir leider nicht. "Dispatcher.CheckAccess()" gibt es nicht unter Windows.Threading. "new MethodInvoker" auch nicht...

Aber dann weiß ich wenigstens, wonach ich suchen muss, danke.

Was bei mir funktioniert hat (mehr für mich, damit ich es später nochmal finde):


        private void FinishEvent()
        {
            if (Dispatcher.Thread == System.Threading.Thread.CurrentThread)
            {
                pbProgress.Foreground = Brushes.Green;
                pbProgress.Value = 100;
                pbProgress.IsIndeterminate = false;
            }
            else
            {
                Dispatcher.Invoke(DispatcherPriority.Normal, (Action)delegate { FinishEvent(); });
            }
        }

19.02.2009 - 12:58 Uhr

Hallo,

eine kurze Frage. Ich hatte das Problem, dass ich in meiner GUI abfragen möchte, ob mein Thread schon fertig ist, damit die GUI dies dann anzeigen kann. Dafür bin ich so vorgegangen, wie es in diesem Thread hier beschrieben wird:

[Lösung] Problem mit EventHandler

Das funktioniert auch. Den Thread starte ich per Knopfdruck, der rödelt im Hintergrund, die GUI läuft schön flüssig weiter und zeigt eine Progressbar an (auf IsIndeterminate, also ohne wirkliches Ziel, läuft einfach durch).
Jetzt möchte ich die Progressbar anhalten, wenn der Thread fertig ist.

Dafür hab ich einen Event geschrieben, der wird gefeuert, sobald alles andere erledigt ist was der Thread machen soll. Meine GUI-Klasse hat diesen Thread abonniert und er wird auch aufgerufen. Das Ding macht auch nichts anderes als:

        private void FinishEvent()
        {
            pbProgress.IsIndeterminate = false;
        }

Warum bekomme ich trotzdem die Meldung:
"Der aufrufende Thread kann nicht auf dieses Objekt zugreifen, da sich das Objekt im Besitz eines anderen Threads befindet."?

25.11.2008 - 11:16 Uhr

Ich danke dir michlG! Werde das heute gleich mal austesten! 🙂

edit: Das scheint leider nicht den gewünschten Effekt gebracht zu haben:

Projektfenster

Optionen

21.11.2008 - 12:13 Uhr

Du könntest den Test in etwa so schreiben:


        [Test]
        public void CheckID() {
            bool check = true;
            for(int i = 1; i <= 1000; i++) {
                        if (!login.CheckID(i))
                        {
                              Console.WriteLine("False bei ID: " + i.ToString();
                              check = false;
                        }      
            }
            if (!check)
                Assert.Fail("Found false, see Console for info.");
        }

Das ist vielleicht nicht so schön, sollte aber funktionieren.

21.11.2008 - 10:48 Uhr

Moin,

mich nervt eine Kleinigkeit wenn ich mit VS2008 an einer WPF Anwendung arbeite. Bei bestimmten Änderungen bekomme ich, wenn ich zurück in den Designer wechsel, die Meldung: "An assembly or related document has been updated which requires the designer to be reloaded. Click here to reload.". Das ganze in einem gelben Balken unter den Tabs.

Bevor man da nicht geklickt hat, kann man nicht weiter im Designer arbeiten. DAS NERVT! Wenn er den Reload braucht, dann soll er doch. Kann man das irgendwo einstellen, dass er autom. reloaded wenn es nötig ist?

23.10.2008 - 17:14 Uhr

Der Name der Digitalen Signatur, also Eigenschaften, Reiter "Digitale Signatur" und dort der Name von der Person/Firma, der die Signatur gehört.

23.10.2008 - 15:48 Uhr

Hallo,

nach ein wenig unbefriedigender Suche in Google und MSDN, muss ich jetzt mal hier fragen.

Wie kann ich die Digitale Signatur (ich brauch eigentlich nur den Namen) einer Datei mit C# auslesen?

Gruß,
Feroc

03.10.2008 - 11:36 Uhr

mmh... erstmal danke für den Ansatz. Bei meinem aktuellen Problem bekomme ich meine Daten aus verschiedenen Quellen. Manches sind Informationen aus XML Dateien, anderes kommt aus Datenbanken und andere wiederrum einfach nur eine Liste aller Dateien direkt aus einem vorhandenen Ordner im Netzwerk.

Knackpunkt ist, dass ich am Ende eben ein Überobjekt habe, welches X Unterobjekte erstellt und jedes Unterobjekt nochmal Y Unter-Unterobjekte. Und von jedem Unter-Unterobjekt (Mitarbeiter im Beispiel) möchte ich eben auch die Informationen vom Hauptobjekt haben.

Was eher sein sollte:
"Firma hat Abteilungen, Abteilung hat Mitarbeiter"
Vererbung ist hier nirgends im Spiel.

Kurz gesagt, eine Firma hat eine Liste an Abteilungen, eine Abteilung eine Liste an Mitarbeitern. Wie du das konkret implementierst, sollte dann aus deiner weiteren Planung ersichtlich sein.

Nur auch da hab ich das Problem, dass ich eben die Objekte der Liste dynamisch erzeugen muss...

Wie Bhaal schon geschrieben hat brauchst du hier keinerlei Vererbung, du erstellst einfach eine MitarbeiterKlasse (wenn die Daten aus einer Datenbank kommen hast du sogar schon die Felder), und dann füllst du einfach für jeden Datensatz ein Mitarbeiterobjekt (z. B. mit Mitarbeiter ma = new Mitarbeiter(DataRow row)Augenzwinkern diese Mitarbeiter fügst du einer List<Mitarbeiter> einer Abteilung hinzu (diese wurde auch aus der Datenbank geladen) und letztlich fügst du die Abteilung einer List<Abteilung> deiner Firma hinzu - wenn du es denn so machen möchtest.

Danke, das werde ich dann mal probieren. 🙂

edit:

Der beste Ansatz sowas zu machen (wie BhaaL schon angemerkt hat) ist es, das mit "ist ein" oder "hat ein" zu prüfen, wobei "ist ein" eine Vererbung ist und "hat ein" eine Aggregation.

Jup, natürlich. Wenn ich auf einem Schlauch steh, dann mit beiden Beinen! 😁

03.10.2008 - 11:11 Uhr

Hallo,

ich grübel gerade ein wenig, wie man folgendes Problem am elegantesten löst. Es gibt noch keinerlei Quellcode, bisher nur ein simples Diagram.

Um es ganz simpel zu machen, folgendes Beispiel:

Ich habe 3 Klassen:

"Firma"

  • string FirmaName

"Abteilung"

  • string AbteilungName
  • int AnzahlMitarbeiter

"Mitarbeiter"

  • string MitarbeiterName
  • int Gehalt

Abteilung erbt von Firma, Mitarbeiter von Abteilung.

Jetzt der Teil wo ich auf dem Schlauch stehe:
Ich möchte am Anfang eine Klasse Firma erstellen. In der Klasse Firma soll dann für jede Abteilung ein Objekt erstellt werden und in der Klasse Abteilung für jeden Mitarbeiter ein Objekt.
Nur möchte ich natürlich nicht jede Abteilund und jeden Mitarbeiter von Hand erstellen (eine Liste aller Abteilungen und Mitarbeiter kommt von einer Datenbank/XML Datei oder sonst was).

Für dieses dynamische Erzeugen der Objekte, so dass ich auch bequem darauf zugreifen kann, fehlt mir irgendwie gerade der Lösungsansatz. Wäre schön, wenn man mir mit ein paar Stichwörter, Lösungsansätzen oder Links auf die Sprünge helfen könnte. Vielen Dank. 🙂

30.09.2008 - 16:15 Uhr

Die Datei "später" zu bearbeiten ist leider keine Option. Aber ich hab jetzt ein wenig mit den Objekten jongliert und konnte es so umstricken, dass jetzt nur noch ein und das gleiche Objekt auf die Datei zugreifen, dann klappt es. 🙂

30.09.2008 - 14:38 Uhr

Hallo,

ich hab hier eine Datei (MSI) auf die ich zugreifen möchte. Irgendwo im Speicher befindet sich wohl aber noch ein Teil, der auf die Datei zugreift. Allerdings finde ich keine Objekte die noch auf die Datei zugreifen, auch wird die Datei nach einiger Zeit von alleine freigegeben.

Gibt es eine Funktion mit der ich testen kann, ob man auf die Datei zugreifen kann? Abgesehen von irgendwas mit try-catch.

Noch schöner wäre natürlich eine Funktion mit der ich den Zugriff erzwingen kann. 🙂

29.09.2008 - 16:52 Uhr

Falls es wen interessiert, so gings:

System.Runtime.InteropServices.Marshal.ReleaseComObject(db);
29.09.2008 - 14:48 Uhr

Hallo,

ich muss hier ein paar Operationen auf eine MSI Datei ausführen. Dafür nutze ich folgenden Code:


string PathToMSI = @"C:\test.msi";
string SQL = "blubb"; //Funktionstüchtiger SQL String
Type classType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Object installerClassObject = Activator.CreateInstance(classType);
Installer installer = (Installer)installerClassObject;

Database db = installer.OpenDatabase(PathToMSI, 1);

WindowsInstaller.View v = db.OpenView(SQL);
v.Execute(null);
v.Close();
db.Commit();

Das funktioniert auch alles wunderbar. Das Problem ist wenn ich einen 2. Zugriff auf die gleiche Datei machen muss. Dann weigert er sich die erstmal zu öffnen - kann leider keine genauere Fehlermeldung geben, das ganze ist in der Database db... Zeile.
Ich kann das ganze in einer Schleife laufen lassen und beim ~1000. Versuch klappt der Zugriff dann auf einmal. Das kann aber natürlich kein Dauerzustand sein.

Ein db.Close() oder ähnliches gibt es leider nicht.

Ich steh leider gerade total auf dem Schlauch, wie ich die Datei wieder freigeben kann. 🙁

29.09.2008 - 14:42 Uhr

Wenn ich könnte, dann würde ich VS2008 nutzen, leider ist VS2005 die Vorgabe im Büro und mein kleiner Ausflug in die WPF Welt eher die Ausnahme.

Naja, ich geh den einfach Weg... gibts halt kein WPF. 😜

Danke für die Hilfe.

26.09.2008 - 14:26 Uhr

Nein, ist kein Express. Und das im Link von dir ist genau das, was ich installiert hab. 🙁

26.09.2008 - 13:54 Uhr

Hallo,

ich möchte eigentlich eine WPF Anwendung mit VS2005 machen. Da VS2005 das von Haus aus anscheinend nicht mag, bin ich wie hier vorgegangen: http://code-inside.de/blog/2007/10/30/howto-visual-studio-2005-fr-net-30-wpf-wcf-wf-rsten/

Wenn ich das Plugin allerdings installiere, dann kommt die Fehlermeldung, dass ich dafür das .NET Framework 3.0 brauche. Das ist allerdings installiert (3.5 um genau zu sein).

Hat da jemand eine Idee?

28.08.2008 - 09:53 Uhr

Hallo,

folgendes Szenario:

Ich habe zwei Projekte. Eines enthält nur die GUI, das andere die Logik. Aus der GUI heraus rufe ich nur eine Funktion aus der Logik auf, alle anderen sind private und werden dann Logik-intern abgearbeitet.

Auf der GUI habe ich allerdings eine Listbox, die ich zur Statusanzeige nutze. Dafür gibt es eine kleine Funktion, die die Listbox füllt und aktualisiert. Dort sollen jetzt allerdings noch mehr Informationen angezeigt werden, nämlich auch Dinge, die intern in der Logik ablaufen.

Was ist jetzt der schönste Weg, um von einem anderen Projekt auf die geöffnete Form, bzw auf eine Funktion in der geöffneten Form zuzugreifen?

28.05.2008 - 09:45 Uhr

Moin,

ich hab hier einen NUnit Test, der einen WebService testet. Das ganze sind etwa 25 Tests. Einzeln funktionieren alle Tests wunderbar und ohne Probleme.

Es gibt allerdings manche Tests, die oft (nicht immer!) nicht miteinander funktionieren. Ich hab jetzt zwei Tests gefunden, die oft nicht miteinander laufen, die Funktionen ansich haben nichts miteinander zu tun, es gibt also keinen Grund, weshalb Funktion B nicht gehen sollte, wenn Funktion A ausgeführt wird.
Schau ich mir einen Mitschnitt in Wireshark an dann seh ich, dass er für Funktion B nichtmal mehr einen Request abschickt.

Allerdings steh ich gerade auf dem Schlauch und hab keine Ahnung, warum er nicht mal den Request abschickt. Ich hab auch schon versucht ein paar Sleeps einzubauen, so dass er erstmal 10 Sekunden zwischen jeder Web Anforderung wartet, das bringt dann was, wenn ich nur die 2 ausgewählten tests laufen lasse, lass ich dann aber wieder alle laufen, dann schlägt es beim 2. der oben erwähnten Tests wieder fehl.

Wenn so ein Test fehlschlägt, dann gehen auch oft (wieder nicht immer) auch die restlichen Test in die Hose.

Ich weiß, ist bestimmt schwer hier was zu sagen... aber vielleicht hat wer ne Anhaltspunkt, wo ich überhaupt noch schauen könnte?!

19.05.2008 - 13:50 Uhr

Ha... es war schreiende Blödheit meinerseits. Wie immer. 🙂

Man sollte vielleicht erst Console.WriteLine machen und danach erst das Assert! =)

19.05.2008 - 13:43 Uhr

Hallo,

ich hab jetzt ein wenig gegoogelt, doch eine klare Aussage oder ein funktionierendes Beispiel konnte ich nicht finden. Also doch wieder ein Thread.

Ich mache hier Tests mit NUnit und der GUI von NUnit. Dort habe ich ja die schönen Tabs: Console.Out, Console.Error, Trace, Log...

... in irgendeins von denen würde ich gerne schreiben! In der Doku stand eigentlich, dass Console.out das enthält, was man in die Console schreiben würde, doch bei mir bleibt das leer!?

Jemand nen Tipp?

15.05.2008 - 10:25 Uhr

Danke für die Hilfe, ich hab eine fehlerhafte WSDL geliefert bekommen... mit der richtigen konnte ich einen Proxy basteln, der sich zu dem Service verbindet.

Aber leider noch eine Zusatzfrage:

Ich hab jetzt eine Funktion, die erwartet einen Benutzernamen.

Geben ich der Funktion den falschen Benutzernamen, dann bekomme ich die korrekte Exception zurück.

Wenn ich jetzt der Funktion den richtigen Benutzername gebe, dann bekomme ich nur NULL zurück (eigentlich erwarte ich einen String). Schau ich mir die Netzwerkkommunikation mit Wireshark an, dann wird mir da aber der korrekte String zurückgeliefert.

12.05.2008 - 10:20 Uhr

Moin moin,

mein nächstes WebService Problem. Ich möchte einen PHP-NuSoap-WebService verwenden. Leider weigert sich C# standhaft.

Wenn ich die WSDL Seite des WebServices als WebReferenz eintrage, dann macht er das zwar brav, aber er zeigt mir keinerlei Funktionen des WebServices an, nichtmal eine Instanz davon kann ich erstellen.

08.05.2008 - 11:23 Uhr

Danke, ich hab den Fehler gefunden. Ich hab es als "Service Reference" geadded, da ich den WebService allerdings etwas umstricken musste, wollte er das wohl nicht. Hab es jetzt als "Web Reference" geadded, dann funktioniert alles. 🙂

08.05.2008 - 10:56 Uhr

Hallo,

ich habe letztens einen WebService geschrieben, dieser WebService beinhaltet 2 Namespaces die ich an manche Funktionen binden musste. Der Client der auf den WebService zugreift ist auch zufrieden damit und soweit funktioniert alles.

Jetzt möchte ich den Service selber noch testen und möchte darauf zugreifen. In einer Version ohne die Namespaces im Service hat es wunderbar funktioniert, mit den Namespaces meckert er immer. Dazu später noch..

Wenn ich eine Instanz meines Services initialisieren möchte, bekomme ich folgendes zur Auswahl:

.ns1 (Interface)
.ns1Channel (Interface)
.ns1Client (Klasse)
.ns2 (Interface)
.ns2Channel (Interface)
.ns2Client (Klasse)

Ich hab es jetzt mit dem Interface...

MOS.ns1 myClient = new MOS.ns1Client();

... oder ohne probiert:

MOS.ns1Client myClient = new MOS.ns1Client();

Als Fehlermeldung bekomme ich, wenn ich dann eine Funktion aufrufen möchte:

System.InvalidOperationException : Ein Endpunktkonfigurationsabschnitt für Vertrag "MOS.ns1" konnte nicht geladen werden, da mehr als eine Endpunktkonfiguration für diesen Vertrag gefunden wurde. Geben Sie den bevorzugten Endpunktkonfigurationsabschnitt mit Namen an.

Bei Google habe ich nichts zu gefunden und ich kann damit irgendwie auch nichts anfangen. Was für einen "Endpunktkonfigurationsabschnitt"?

29.04.2008 - 12:59 Uhr

Hallo,

ich hoffe einfach mal, dass ich jetzt wieder gleich die Antwort finde. Die letzte Stunde MSDN durchsuchen hat mir leider nichts gebracht.

Nochmal zur Geschichte: Ich versuche einen WebService (NuSoap) mit meinem .NET Service zu ersetzen. Der Client ist fix und kann nicht geändert werden.

Ich bekomme bei einer Funktion des alten Servers folgendes zurückgeliefert:


	<SOAP-ENV:Body>
		<ns1:FUNKTIONSNAMEResponse xmlns:ns1="http://fubar">
			<soapVal xsi:type="xsd:string">lustiger String</soapVal>
		</ns1:FUNKTIONSNAME>
	</SOAP-ENV:Body>

Mir geht es um den <soapVal... Teil. Denn mein Service gibt mir den Teil leider so zurück:


	<soap:Body>
		<FUNKTIONSNAMEResponse xmlns="http://fubar">
			<FUNKTIONSNAMEResult>lustiger String</FUNKTIONSNAMEResult>
		</FUNKTIONSNAME>
	</soap:Body>

Es muss doch irgendwie möglich sein, dass ich den Result-Tag so anpassen kann, dass er mir auch einen soapval zurückliefert?

Die letzte Stunde hab ich in der MSDN die Attribute von WebMethod und SoapDocumentMethod studiert, konnte da leider nichts passendes finden. Jemand eine Idee?

29.04.2008 - 11:19 Uhr

Wie immer, kaum eröffne ich nen Thread, schon finde ich es. 🙂

Falls es wen interessiert, so funktioniert es:


[WebMethod]
[SoapDocumentMethod(Action="foo:Funktionsname")]
        public string Funktionsname(string foo, string bar)
        {
            return "blubb";
        }

29.04.2008 - 10:51 Uhr

Hallo,

ich hab hier einen Client, der auf einen WebService zugreift. Dieser Client ist fix und kann leider nicht verändert werden.

Der WebService des Clients soll allerdings ausgetauscht werden. Leider erwartet dieser Client den Bezeichner des Namespaces vor der Funktion und der Teil möchte gerade nicht funktionieren.

Der Client erwartet also "foo:Funktionsname", das möchte mein .NET allerdings nicht zurückliefern. Ich hab es schon versucht ihm als WeMethod Attribut "MessageName" vorzugaukeln, das möchte er nicht... ich hab dem WebService das Attribut "Name" mit dem entsprechenden Kürzel versehen (Namespace natürlich auch) nur auch das mag nicht gehen.

Kann mir jemand einen Tipp geben?

28.04.2008 - 09:53 Uhr

Hallo,

ich habe hier eine WSDL Datei und möchte daraus einen WebService generieren lassen (bzw. zumindest mal die Funktions-Rümpfe).

Allerdings bekomme ich bei allen Funktionen nur folgende Meldung in der CS Datei vom Output:


// CODEGEN: Die FUNKTIONSNAME-Vorgangsbindung von Namespace 'urn:NAMESPACENAME' wurde ignoriert. Die [URL]http://schemas.xmlsoap.org/soap/encoding-Codierung[/URL] wird nicht unterstütz.

Kann man da noch irgendwas machen oder hab ich einfach Pech gehabt!?

10.03.2008 - 13:53 Uhr

Wenn ich die Erklärung richtig verstanden habe, dann: ja.

Erstellt wird es so:


        private DataSet getSQLData(string strSQL)
        {
            OleDbConnection Con = new OleDbConnection(SQL.oleDbConnString);
            DataSet ds = new DataSet();
            OleDbDataAdapter da = new OleDbDataAdapter(strSQL, Con);
            da.Fill(ds);
            return ds;
        }

10.03.2008 - 13:39 Uhr

Daran sollte es eigentlich nicht liegen. Inzwischen bin ich einen Schritt weiter.

Mit [X_XXXApplicationID.Description] funktioniert es, es haben also nur die eckigen Klammern gefehlt. Nur bei ScTypeID möchte es nicht funktionieren... nunja, da wird der Fehler dann wo anders liegen.

Danke...

10.03.2008 - 10:43 Uhr

Moin,

hab hier ein kleines Problem. Ich hab eine kleine Access Datenbank, aus dieser möchte ich einige Daten in einem ListView anzeigen. Das klappt eigentlich auch, nur möchte er mir die Daten, welche ich in der Abfrage mit einem Inner Join verknüpft habe, nicht anzeigen.

Der SQL-String ansich funktioniert, in Access zeigt er mir damit das richtige Ergebnis an. In C# lade ich das ganze in ein DataSet:


            SMAT_WPF.RAL.DBIO DataAccess = new SMAT_WPF.RAL.DBIO();
            ContentListView.DataContext = DataAccess.getOverviewShortcuts().Tables[0];
            ContentListView.SelectedValuePath = "ShortcutID";

Im XAML Teil weiße ich ihm dann zu, was er anzeigen soll:


        <ListView ItemsSource="{Binding}" x:Name="ContentListView" Margin="0,60,0,0" MouseDoubleClick="ContentListView_MouseDoubleClick">
            <ListView.View>
                <GridView>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=ShortcutID}" Header="ShortcutID"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=X_XXXApplicationID.Description}" Header="Application"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=ScTypeID}" Header="Type"/>
                    <GridViewColumn DisplayMemberBinding="{Binding Path=NameID}" Header="Name"/>
                </GridView>
            </ListView.View>

Das erste Feld (ShortcutID) wird korrekt angezeigt, dies kommt allerdings auch aus der ursprünglichen Tabelle. Die anderen Felder sollen über den Inner Join den richtigen Wert und nicht die ID anzeigen. Ich hab versucht...

a) Den vollständigen Pfad anzuzeigen: X_XXXApplicationID.Description
b) Den Namen in der Ursprungstabelle zu benutzen: ScTypeID
c) Dem ganzen einen eigenen Namen zuzuweißen

Die ShortcutIDs werden alle richtig angezeigt... die restlichen Felder bleiben leer.

Was mach ich hier falsch?

20.02.2008 - 13:04 Uhr

Aha... ok, gut vielen Dank. Dachte die Panels wären eigentlich für genau das gedacht was ich da vorhab...

Aber mit dem Grid funktioniert es, also bin ich zufrieden. Vielen dank mal wieder. 🙂

20.02.2008 - 12:46 Uhr

Moin,

hier erstmal die Konstruktion die ich habe:

        <StackPanel Name="stackPanel3" Orientation="Horizontal">
            <StackPanel Name="labelPanel1">
                <Label Height="23" Name="label1" Width="120">Test Beschreibung 1:</Label>
                <Label Height="23" Name="label2" Width="120">Test Beschreibung 2:</Label>
                <Label Height="23" Name="label3" Width="120">Test Beschreibung 3:</Label>
            </StackPanel>
            <StackPanel Name="stackPanel1">
                <TextBox Height="23" Name="textBox1" Width="Auto" MinWidth="120" />
                <TextBox Height="23" Name="textBox2" Width="Auto" MinWidth="120" />
                <TextBox Height="23" Name="textBox3" Width="Auto" MinWidth="120" />
            </StackPanel>
            <StackPanel Name="labelPanel2">
                <Label Height="23" Name="label4" Width="120">Test Beschreibung 1:</Label>
                <Label Height="23" Name="label5" Width="120">Test Beschreibung 2:</Label>
                <Label Height="23" Name="label6" Width="120">Test Beschreibung 3:</Label>
            </StackPanel>
            <StackPanel Name="stackPanel2">
                <TextBox Height="23" Name="textBox4" Width="Auto" MinWidth="120" />
                <TextBox Height="23" Name="textBox5" Width="Auto" MinWidth="120" />
                <TextBox Height="23" Name="textBox6" Width="Auto" MinWidth="120" />
            </StackPanel>
        </StackPanel>

Ausschauen tut das ganze dann so:

Ich hab also ein Stack Panel (Horizontal) in dem sich 4 Stack Panels (Vertikal) befinden. Zweck des ganzen soll sein, dass sich beim Resize des Fensters das ganze dann eben schön anpasst.
Dabei sollen die Panels mit den Labels eine feste Größe habe und die Panels mit den Textboxen sollen sich strecken. Allerdings scheint sich das Panel mit den Textboxen an die Textbox anzupassen und nicht daran, wieviel Platz sie noch hätte. Lass ich z.B. die MinWidth bei den Textboxen weg, dann ist das Panel gefühlte 1mm breit. Sollte mit Width="Auto" die jeweiligen Objekte so viel Breite einnehmen wie sie können!? Oder hab ich da was falsch verstanden!?

18.02.2008 - 12:16 Uhr

Mist, jetzt war ich eine Sekunde zu spät. In dieser Sekunde ist mir der Expander ins Auge gesprungen. 🙂

Damit kann ich rumspielen, vielen dank...

18.02.2008 - 12:09 Uhr

Moin,

erstmal ich meine nicht die Ribbons aus Office 2007, sondern das Menü, welches man in Access 2007 für die Tabellen hat.

Hier mal ein Bild:
http://www.addintools.com/english/menuaccess/images/screen_shot_big.gif

Das auf der linken Seite mit "Tables", "Queries" und so weiter... kann man mit einem der Objekte von WPF so etwas in der Art basteln!?

14.02.2008 - 11:48 Uhr

aha... Pages und Frame... vielen Dank, funktioniert wunderbar. 🙂

14.02.2008 - 10:27 Uhr

Moin,

ich hab mal eine Frage. Oft merke ich, dass ich mir das Arbeiten unnötig schwer mache, weil ich irgendwelche Dinge einfach nicht kenne.

So, jetzt bin ich gerade am Planen einer UI und soll dafür mehrere Optionen anbieten. Eine Option soll wie folgt aussehen:

Auf der linken Seite des Windows ist ein TreeView, dieser wird als Menü missbraucht. Auf der rechten Seite soll dann, je nach Auswahl, eine Seite erscheinen.

Mein Plan war jetzt, dass ich mehrere Panels (oder halt Grids) nehme und die ein oder ausblenden lasse. Das ganze würde allerdings damit enden, dass ich ~15 Panels hätte, die alle eigentlich an der gleichen Stelle liegen sollen. Das ganze gemütlich zu bearbeiten ist dann fast unmöglich.

Hat da jemand eine Alternative oder gibts einen einfachen Trick, wie man das besser bearbeiten/umsetzen kann?

03.02.2008 - 20:25 Uhr

Hallo,

ich bräuchte mal ein Stichwort, damit ich hier etwas voran komme. Mir geht es darum, dass ich das Textfeld einer anderen Windows Applikation auslesen möchte.

Meine Google Suche ist im Moment nicht sehr erfolgreich, da ich nicht so wirklich weiß, was ich suchen soll.

Wäre schön, wenn mir jemand ein Stichwort nennen könnte.

Vielen Dank...

30.01.2008 - 14:06 Uhr

Danke... wusste nicht, dass meine XAML Datei nicht autom. die Klassen kennt in der sie auch selber ist.

Funktioniert jetzt bestens.

30.01.2008 - 13:30 Uhr

ah ok, hilft schonmal sehr weiter zu wissen, dass das "local" der Namespace sein soll. Leider funktioniert das immer noch nicht, ich hab jetzt das "local:DrawingCanvas" durch "Labyrinth:DrawingCanvas" ausgetauscht.

Als Fehlermeldung kommt immer noch:
''Labyrinth' is an undeclared namespace. Line 8, position 10.' XML is not valid.

Wenn ich aber in meinen Code schaue... (Window1.xaml.cs)

namespace Labyrinth
{
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>

    public class DrawingCanvas : Canvas
    {
        private List<Visual> visuals = new List<Visual>();
        protected override int VisualChildrenCount
        {
            get { return visuals.Count; }
...

Müsste doch eigentlich funktionieren oder hab ich noch etwas übersehen?

30.01.2008 - 11:01 Uhr

Moin,

ich versuch mich gerade an einem Beispiel aus einem Buch und hänge leider im Moment. Aufgabe ist es Rechtecke zu zeichnen...

Hierfür wird im Buch erklärt, dass man dafür erstmal eine Zeichenfläche braucht, diese soll in Form eines DrawingCanvas erstellt werden, dafür erstellt man folgendes:

public class DrawingCanvas : Canvas
{
private List<Visual> visuals = new List<Visual>();
protected override int VisualChildrenCount
{
get { return visuals.Count; }
}
protected override Visual GetVisualChild(int index)
{
return visuals[index];
}

public void AddVisual(Visual visual)
{
visuals.Add(visual);
base.AddVisualChild(visual);
base.AddLogicalChild(visual);
}
public void DeleteVisual(Visual visual)
{
visuals.Remove(visual);
base.RemoveVisualChild(visual);
base.RemoveLogicalChild(visual);
}
}

Das ganze soll dann so eingebunden werden:

<local:DrawingCanvas x:Name="drawingSurface" Background="White" ClipToBounds="True"
MouseLeftButtonDown="drawingSurface_MouseLeftButtonDown"
MouseLeftButtonUp="drawingSurface_MouseLeftButtonUp"
MouseMove="drawingSurface_MouseMove" />

Allerdings meckert er bei "local:DrawingCanvas" rum, weil er es nicht finden kann. Die Frage ist: Wo erstelle ich denn diese Klasse? Ich habs jetzt in der Klasse von meinem Window probiert, parallel zum Window und in einer eigenen Datei, doch finden mag er es nie.

Kleiner Tipp wieso?

18.01.2008 - 13:03 Uhr

Hallo nordside,

danke für den Tipp, mit grid1.Children klappt es sehr gut. Ich sollte mich daran gewöhnen, dass das Window ansich wohl nicht mehr all zu viel macht.

@talla:
Danke, werd es mir hinter die Ohren schreiben.

18.01.2008 - 12:19 Uhr

Hallo talla,

erstmal ein großes Danke für deine Hilfe... und vor allem für deine Geduld, die findet man nicht oft in Foren, vor allem wenn man wohl so simple Fragen stellt wie ich gerade.

Zu 1a und 2:
Ich bin das ganze wohl zu kompliziert angegangen. Wenn ich das ganze jetzt nochmal Schritt für Schritt nachbastle, dann funktioniert alles wunderbar. Hab mir wohl nur selber ein Bein gestellt mit meiner manuellen Anpassung der Breite und Höhe. Resize funktioniert perfekt und das ohne eine Zeile Code. Vielleicht werden WPF und ich doch noch Freunde. 🙂

Zu 1b:
Weil ich es früher oder später bestimmt trotzdem noch brauche, würde ich das gerne noch verstehen. Wenn es dir nicht zu aufwändig ist, dann hätte ich gerne ein kleines Beispiel.
Sagen wir ich habe ein Window "frmMain" und in diesem Window befinden sich 128 Labels, alle Labels sollen jetzt den gleichen Content bekommen.
Früher ging das ja so:

			foreach (Label lbl in Controls)
			{
				lbl.Text = "Tada!";
			}

Dafür suche ich den passenden Ersatz im Moment, da es "Controls" wohl nicht mehr gibt!?

18.01.2008 - 11:06 Uhr

Einen kurzen Überblick gab es auch in einer der letzten Ausgaben der c't, kann allerdings nichts über die Qualität des Artikels sagen.

18.01.2008 - 09:31 Uhr

Hallo,

als eingefahrener Windows Forms Designer kämpfe ich weiterhin mit den Eigenheiten von WPF, möchte es aber trotzdem versuchen "korrekt" umzusetzen. Allerdings legt mir WPF hier einige Stolpersteine in den Weg, ja ich möchte sogar sagen, WPF mag mich nicht und macht es mit Absicht!

1a.
Die erste Frage beschäftigt sich mit dem Resize des Windows. Wenn ich die Möglichkeit schon habe, dass sich alles schön anordnet, dann nutze ich es auch.
Stelle ich jetzt allerdings die Size meines Grids auf "Auto" und vergrößere das Window, dann bleibt die Größe des Grids erhalten. Es bleibt zwar schön mittig und macht mir einen weißen Rahmen drum, aber unter "Auto" versteh ich was anderes.
Meine Lösung ist bisher die Size manuell beim SizeChanged Event zu ändern, aber das sieht inzwischen schon so aus:


            double myHeight = frmShortcuts.Height;
            double myWidth = frmShortcuts.Width;
            gridMain.Width = myWidth;
            gridMain.Height = myHeight;
            tabShellObjectSelection.Width = myWidth;
            tabShellObjectSelection.Height = myHeight;
            gridShortcuts.Width = myWidth;
            gridShortcuts.Height = myHeight;
            tabShortcuts.Width = myWidth;
            tabShortcuts.Height = myHeight;
            gridShortcuts.Width = myWidth;
            gridShortcuts.Height = myHeight;
            gridOverview.Width = myWidth;
            gridOverview.Height = myHeight;
            gridCreateNewFolder.Height = myHeight;
            gridCreateNewFolder.Width = myWidth;

Und ich bin noch nichtmal halb fertig mit allen Tabs. Denke mal das geht schöner?!

1b.
Ein schönerer Weg dafür wäre natürlich einfach foreach, ich muss zugeben, dass ich bisher allerdings die Funktion nicht gefunden habe, die mir eine Liste der Objekte in meinem Window zurück liefert. Hat jemand einen kurzen Tipp?


            double myHeight = frmShortcuts.Height;
            double myWidth = frmShortcuts.Width;
            foreach (Grid myGrid in frmShortcuts.???)
            {
                myGrid.Height = myHeight;
                myGrid.Width = myWidth;
            }

Zum Testen habe ich mal ein ListView in eines der Grids hinzugefügt:


<ListView Name="listView1" Margin="0,0,10,10" Grid.ColumnSpan="2">

Es funktioniert auch gut, zumindest passt sich das ListView schön an die Größe der Form an. Allerdings ignoriert er gekonnt den Margin Wert. Im Editor hab ich noch einen schönen Rand rechts und unten, sobald ich es allerdings starte liegt das View genau am Fenster an.

Hoffe mir kann jemand helfen. 🙂

18.01.2008 - 09:06 Uhr

HAllo,
ich arbeite zwar an Visual Studio 2005.

aber was könntet mir emphelen mit WPF zu arbeiten oder lieber mit Sileverlight? gibt es unterschied ?

Dank

Silverlight ist fürs Web, quasi ein besseres/anderes Flash (von der Aufmachung her, keine Ahnung wie es mit der Technik steht).

16.01.2008 - 09:10 Uhr

Damit ich hier auch mal was halbwegs sinnvolles beitragen kann. Es gibt noch eine simple, dafür vielleicht nicht so ellegante Lösung.

Das ist nicht mein Code, hatte nur einmal das gleiche Problem und fand dann diesen hier:


        #region DoEvents
        private static System.Windows.Threading.DispatcherOperationCallback exitFrameCallback = new
             DispatcherOperationCallback(ExitFrame);

        private static Object ExitFrame(Object state)
        {
            DispatcherFrame frame = state as DispatcherFrame;

            // Exit the nested message loop.
            frame.Continue = false;
            return null;
        }

        public static void DoEvents()
        {
            // Create new nested message pump.
            DispatcherFrame nestedFrame = new DispatcherFrame();

            // Dispatch a callback to the current message queue, when getting called,
            // this callback will end the nested message loop.
            // note that the priority of this callback should be lower than the that of UI event messages.
            DispatcherOperation exitOperation = Dispatcher.CurrentDispatcher.BeginInvoke(
                DispatcherPriority.Background, exitFrameCallback, nestedFrame);

            // pump the nested message loop, the nested message loop will immediately
            // process the messages left inside the message queue.
            Dispatcher.PushFrame(nestedFrame);

            // If the "exitFrame" callback doesn't get finished, Abort it.
            if (exitOperation.Status != DispatcherOperationStatus.Completed)
            {
                exitOperation.Abort();
            }
        }
        #endregion

Du rufst dann einfach DoEvents(); an der Stelle auf, an der aktualisiert werden soll. Klappt wunderbar...

15.01.2008 - 15:54 Uhr

Ich hab mir die ganzen Panels mal näher angeschaut, stell es mir schon nicht so einfach vor ein gewünschtes Layout damit hinzubekommen.

Erstmal muss ich ja einige der Panels miteinander mischen, damit ich das überhaupt bei einer Auflösung hinbekomme. Wie das ganze dann bei nem Resize der Form ausschaut... naja... ich werds mal ausprobieren, bleibe aber skeptisch. 😜