Versuch das Ganze mal mit INotifyPropertyChanged und/oder ObservableCollections.
Ich meine mich daran erinnern zu können, das man Graphen recht gut mit verketteten Listen im Speicher darstellen kann, also sollte es ja auch beim Speichern in einer Datei funktionieren:
Dazu zunächst einfach mal alle Knoten miteinander verknüpfen:
A - B - C - D - E - F - G
anschließend zu jedem Knoten speichern, welcher andere Knoten von diesem erreicht werden kann:
A - B
|
B - C - D - E
|
C - E
|
D - E
|
E - F
|
F
|
G - D
Kann man auch recht einfach mit XML oder soetwas umsetzen.
Ansonsten kannst du das ganze recht einfach mit 3 Scrollviewern erreichen. Einer für den Content, einer links davon für die Zeilennummern, einer oberhalb für die Spaltennummern (beide jeweils ohne sichtbare Scrollbalken). Das Ganze dann mittels Attached-Properties und DataBinding so verknüpfen, dass die Scrollviewer auch gleichzeitig scrollen und schon ist es fertig 😁
Margins rücken nicht automatisch von allen Seiten ein, du kannst jede Seite einzeln setzen: Margin="0,5,10,-5" usw...
Liegt das Canvas eventuell über den Objekten?
Wenn der Background, z.B. vom Canvas, auf null gesetzt ist, werden keine Events wie MouseEnter, MouseMove, etc. ausgelöst. Wenn du das willst, setz den Background einfach auf Transparent.
Das sollte sich auch durch einen Aufruf von CaptureMouse() auf dem zu verschiebenden Element beim MouseDown und ReleaseMouseCapture() beim MouseUp umgehen lassen.
Hi,
ich habe gestern vom WPF-Toolkit-Calendar auf den 4.0-Calendar umgestellt. Dabei kam es dann zu einem Problem, weil der Verweis auf den VisualStateManager etc. nicht korrekt aufgelöst werden konnte. Eventuell muss man dies dann anpassen.
Auch können sich einige Properties oder Typen geändert haben, so gibts es beispielsweise das GridRowHeaderBorder-Element aus dem Toolkit in der Version des Frameworks nicht mehr.
Prinzipiell ist der Umstieg aber recht einfach zu erledigen, aber man muss im Zweifelsfall ein paar Sachen anpassen.
Schöne Grüße
Ich hatte mit Vista das gleiche Problem, dabei hat es geholfen unter den Diensten den "Microsoft Transient Multi-Monitor Manager" zu deaktivieren. Dabei sind mir keine Fehler aufgefallen, aber das ewige Einstellen nach dem Starten oder Einloggen war weg 😃
Hoffentlich klappt es bei dir auch.
Hier ist etwas, dass recht nah rankommt. Ist zwar in Silverlight, sollte laut John Gossman auch unter WPF genau so gehen.
Der mit dem AttachedProperty ziemlich sicher, da du weiterhin nicht vom ViewModel auf die View zugreifst, sondern den Command einfach bindest und im Property nur die Execute-Methode aufrufst. Lediglich im AttachedProperty müsstest du dich auf das entsprechende Event registrieren, aber da das ja ebenfalls Teil des View ist, sollte es funktionieren.
Schau mal unter den Stichwörtern FlowDocument und FixedDocument nach. Die kannst du den entsprechenden Readern, die es bereits als fertige Control gibt, anzeigen und ggfs. auch den Druck-Dialog aufrufen.
Alternativ kannst du ein AttachedProperty bauen, an das du ein ICommand bindest. Innerhalb dessen rufst du beim KeyUp-Event die Execute-Methode des gebundenen Commands auf.
Ich habe momentan ein HTC-Gerät mit Windows Mobile 6.1 und bin damit eigentlich recht zufrieden, zumindest so lange ich es nicht neu starten muss, was eine halbe Ewigkeit dauert. Es ist sicher nicht der Weisheit letzter Schluss, aber zum Telefonieren etc. reicht es locker.
Mein nächstes wird vermutlich ein Gerät mit Windows Phone 7 Series, da ich das Metro-Design sehr gelungen finde und auch die bisherigen Vorstellungen recht ansprechend waren.
Das iPhone ist an mir bisher komplett vorbeigegangen, aus den Gründen, die hier schon mehrfach genannt wurde.
Ok, Herbivore hat natürlich Recht (wie eigentlich immer 😃) Ich nehme alles zurück und behaupte das Gegenteil !
Bei mir würden alle den Wert 0 haben, nicht 1.
Angenommen ich habe die Kantengewichtungen 1, 3, 8. Nach dem negieren habe ich -1, -3, -8, anschließend zu allen Werten den Betrag des kleinsten Wertes =(|-8| = 8) addieren --> 7, 5, 0.
Dadurch "dreht man die Längen um" und umgeht das Problem mit negativen Kanten, falls es da geben sollte (ist mir nur bekannt, wenn es negative und positive Kanten gibt zusammen).
Dijkstra sollte eigentlich mit negativen Werten funktionieren, solang alle negativ sind. Ansonsten einfach alle Werte negieren und + den Betrag des kleinsten Wertes, dann sind wieder alle positiv und es funktioniert wie gewünscht.
Wenn der Graph allerdings zyklisch sein kann, kommt man mit Dijkstra und dem längsten Weg allerdings nicht weit 😃
Er sucht aber nicht den kürzesten, sondern den längsten Pfad. Eine Pseudo-Code-Implementierung davon findet man z.B. bei Wikipedia: Longest path problem
Ich habe bisher kein Spiel verpasst, auch wenn die meisten eher enttäuschen waren. Aber es gibt einfach nichts besseres als abends mit Freunden zu grillen und dabei ein schönes Fußballspiel zu sehen, mit allem was dazugehört: Jubeln, Fluchen und noch viel mehr Fachsimpeln, einfach super 😃
Dass ich heule, wenn mein Favorit verliert oder sogar ausscheidet, kommt dabei allerdings nicht vor und auch bei den Autokorsos nach einem Sieg bin ich höchstens bei einem WM-Titel für Deutschland oder der Meisterschaft für den VfB dabei 😄
Kurz und knapp: Binding + IValueConverter.
Wobei das Blinken dabei durchaus problematisch werden könnte.
Mit dem Completed-Event meldet eine Animation, dass sie abgeschlossen ist.
Du könntest den Server alle x Sekunden fragen, ob sich was geändert hat (Polling) oder der Server sagt automatisch allen Clients, dass sich was geändert hat, z.B. über einen Duplex WCF Service (hier steht zum beispiel, wie das gehen könnte).
<DataTrigger Binding="{Binding Path=.}" Value="True">
Damit beziehst du dich direkt auf den DataContext selber und nicht auf ein Property darin.
Das Binding in einem DataTrigger bezieht sich immer auf den aktuellen DataContext. In deinem DataTrigger wird nun im DataContext das Property "SaveRequested" gesucht, um es zu behandeln. Da dein DataContext aber selber schon SaveRequested ist, findet er das Property nicht und kann daher nicht daran binden. Du wirst in deinem Output mit ziemlicher Sicherheit eine Meldung stehen haben, dass er das Property nicht finden kann und dass deshalb das Binding nicht funktioniert.
Die Lösung habe ich eben schon gesagt, entweder du machst
this.DataContext = this;
oder änderst das Binding im DataTrigger so ab, wie ich es oben beschrieben habe.
Du musst entweder den DataContext auf das Objekt setzen, dass SaveRequested als Property hat, oder im Trigger den Path auf Path=. setzen.
Hat der Button auch den richtigen DataContext? Ansonsten versuch es einfach mal, indem du die UpdateSourceTrigger-Einstellung weglässt.
Du kannst dir ein Behavior schreiben, welches bei MouseEnter und MouseLeave entsprechend die Sachen setzt.
Ansonsten müsste es auch über EventTrigger gehn, die bei MouseEnter und MouseLeave die Properties setzen.
Ich vermute, dass du den Wert irgendwo überschreibst, weil es im oberen Fall ja scheinbar so funktioniert, wie es sein soll.
Aber wie JAck30lena sagt können wir das ohne lauffähiges Beispiel nicht nachvollziehen.
Dan Wahlin hat auf seinem Blog beschrieben, wie sowas funktioniert. Eventuell hilft es dir ja weiter: Link
TripleX hat recht, ist prinzipiell äquivalent 😃 Hatte mich übrigens vertan, es war ein ItemsControl, kein ContentControl. So ungefähr, aber ohne Garantie, dass es auch wirklich funktioniert, da ich es hier im Editor gebaut hab:
<Grid>
<ItemsControl ItemsSource={TemplateBinding Gridlines}/>
<ItemsControl ItemsSource={TemplateBinding Children}/>
</Grid>
Das erste ItemsControl bekommt die Gridlines als ItemsSource, also im Prinzip als Child-Elements, das zweite dann die Kurven oder was auch immer du darüber zeichnen möchtest. Das Ganze kannst du dann noch anpassen, je nachdem auf welchem Panel die ItemsControls basieren.
Nein, OnRender bringt dir nichts in WPF. Vielmehr solltest du entweder im DataContext den Pfad zu Logo, falls es sich um eine Bilddatei handelt, ablegen und den Style des Menus anpassen. Falls es sich um ein festes Logo handelt, kannst du das auch fest in den Style einbauen.
Ich habe eine Collection von Lines, die ich dann an an ContentControl binde. Die Linien selber muss man im CodeBehind dann dementsprechend anpassen, wenns ich Parameter ändern.
Oh ja, natürlich. Muss sich heute Morgen um eine geistige Umnachtung gehandelt haben bei mir. So sollte es aussehn:
CommandParameter={Binding .}
Also ihne das RelativeSource-Zeug.
Ähm, ich denke nicht, dass es so geht, sondern so wie Axxus vorher geschrieben hat. Wichtig dabei ist, dass zum einen der Index nullbasiert ist, d.h. der gegebene Code würde das Control in die 4. Spalte in der 4. Zeile setzen. Zum anders ist es wichtig, dass das Grid auch dementsprechend viele Zeilen/Spalten enthält.
Ich würd einfach in Paint o.Ä. 7 neue Gifs erstellen und in den Ordner kopieren 😃
Ich habe neulich so etwas ähnliches gemacht und bin dabei wie folgt vorgegangen: Ich habe mir ein eigenes Control geschrieben, das im Hintergrund die Gitternetzlinien zeichnet, jeweils mit einstellbaren Eigenschaften wie x-Abstand, y-Abstand, verschieden dicke Linien, etc. insgesamt sind das etwa 100-150 Zeilen Code, also kein wirklich großer Aufwand.
Für die Kurven, die gezeichnet werden sollen, lege ich vor das Gitternetz einfach ein weiteres ItemsControl, das die Children anzeigt, beispielsweise innerhalb eines Canvas oder Grids.
Die x- und y-Achse habe ich separat erstellt und die Breite/Höhe der Einheiten über Binding mit dem Gitternetz verbunden.
Das Ganze dann noch mit Drag&Drop und sonstigen Späßen, und schon sind 1-2 Tage rum 😄
Hi manullino,
ich würde das Item, dessen Button gerade geklickt wurde, als CommandParameter mitgeben, also wenn du innerhalb des Templates den Command bindest in etwa so:
CommandParameter={Binding .,RelativeSource={RelativeSource Self}}
Da hast du dann das Item drin, welches du geklickt hast und kannst dann im Command damit machen, was du möchtest.
WebServices an sich unterstützen kein "Push-To-Client". Du kannst dir dazu mal diese Diskussion anschauen: klick.
Ansonsten kannst du nur in regelmäßigen Intervallen die Änderungen abfragen.
Du könntest auch einfach einenMultiConverter nehmen, den du an die zwei Properties bindest und einfach als einen Wert zurückgeben.
Ansonsten kannst du im Grid noch SetRow und SetColumn verwenden. Funktioniert äquivalent zu den Canvas-Funktionen.
Wenn du den Standard-Style der MenuItems anschaust, gibt es bei den MenuHeader- und SubMenuHeaderTemplates jeweils ein Popup mit ContentControl und ItemsPresenter, das die SubMenuItems darstellt. Das musst du entsprechend anpassen und dorthin verschieben, wo du es haben möchtest.
Ich nehme an, dass du den Style der MenuItems anpassen musst.
Hat mein Link oben nicht geholfen? Der macht eigentlich genau das was du möchtest... auch in Silverlight !
Mit einem eigenen VM für die ListBoxItems meinte ich, dass die dort gebundenen Objekte (in deinem Fall die DataService.Items) die Commands enthalten. Eventuell kannst du dir um die Items ja einen Wrapper schreiben, der ebenfalls die Commands anbietet. Bei Stackoverflow wird hier eigentlich genau das gemacht.
Hi,
zunächst wäre interessant zu wissen, welche Silverlight-Version du verwendest. Commanding gibt es in SL erst seit Version 4, ich nehme daher einfach mal an, dass du diese verwendest.
Da die RelativeSource-Eigenschaft des Bindings in SL4 nur Self und TemplatedParent unterstützt, fällt diese Möglichkeit auch weg.
Ich denke am einfachsten wäre es, die Commands in den ViewModels der ListBoxItems anzubieten und dort einfach
<Button Command={Binding MyCommand}/>
zu verwenden.
Falls die einzelnen ListBoxItems kein eigenes ViewModel haben, kannst du auch das VM der ListBox verwenden, und direkt die Commands ansprechen.
@CSL: In WPF würde das so gehen, aber soweit ich weiß wird AncestorType in SL nicht unterstützt, weder in Version 3, noch in Version 4.
Silverlight kann keine synchronen Aufrufe. Du kannst das ganze so machen, dass du den asynchronen Aufruf startest und während du darauf wartest ein Overlay über die Anwendung lädst mit einer Progressbar oder Waiting oder sonst etwas. Dadurch blockiert die Anwendung zwar nicht, aber der Benutzer kann trotzdem keine Eingaben machen.
Der Webservice-Proxy bietet in Silverlight für jede Methode des Webservice eine Methode BeginMethodenname und EndMethodennamen. Zusätzlich musst du auf das Completed-Event der entsprechenden Methoden achten. Wenn dies aufgerufen wird, ist der asynchrone Aufruf vorbei und du hast die Ergebnisse.
private void CallWS()
{
proxy.GetNameCompleted += OnGetNameCompleted;
proxy.BeginGetName();
}
private void OnGetNameCompleted(object sender, GetNameCompletedEventArgs e)
{
MessageBox.Show(e.Result);
}
So in der Richtung. Wenn du jetzt noch beim Aufruf das oben genannte Overlay einblendest und beim Completed wieder ausblendest, ist es fertig.
Direkt mixen geht nicht, aber man kann es sich hintricksen:
<MultiTrigger>
<MultiTrigger.Conditions >
<Condition Binding="{Binding IsSelected, RelativeSource={RelativeSource Self}}" Value="True"/>
<Condition Binding="{Binding DropIsPossible}" Value="False"/>
</MultiTrigger.Conditions>
</MultiTrigger>
Bin mir dabei nicht ganz sicher, aber eigentlich sollte es so funktionieren.
Du kannst dir auch mal den Microsoft Application Architecture Guide anschauen. Den gibt es sowohl als Buch oder in der MSDN als PDF zum Download.
Ein WPF-Window in SL öffnen? Ich denke nicht, dass so etwas geht, aber wozu sollte das überhaupt gut sein?
Wenn du das WPF-Window in einem (Web-?)Service öffnest, wirst es auch auf dem Server angezeigt und nicht auf dem Client, ich denke nicht, dass das dem entspricht, was du dir vorstellst.