also, der Surrogat Vorschlag ist zwar interessant, löst aber nicht wirklich mein Problem. ich habe jetzt eine "Benachrichtigungs"-Lösung gebastelt.
Objekte (Personen in dem Beispiel von oben) registrieren sich bei einem "Creator" mit einer bestimmten Benachrichtigungsbedienung. Ist beim Erstelle eines Objektes diese Bedienung erfüllt (z.b. Id des Objektes stimmt überein), wird das registrierte Objekt darüber benachrichtigt.
Und später wieder geladen.
Und genau hier steckt mein Problem. Ich suche also effektivste Möglichkeit die Objekte aus der XML Datei zu laden und die Beziehung herzustellen. Wenn ich zuerst alle Person Objekte erstelle und dann aus der Liste die children und parents suche, mache ich unter Umständen mehrere Durchläufe, biss alle Beziehungen hergestellt sind.
Wenn ich gleich alle Beziehungen herstelle, dann muss ich durch die XML Datei hin und her springen.
Noch 'ne Möglichkeit wäre, dass ein Person Objekt über Erzeugung eines anderen Objektes informiert wird und fügt den dann bei bedarf zu seinen Beziehungen hinzu.
Egal ist es leider nicht. wenn eine Eigenschaft nicht gesetzt ist wird, diese aus einem Parent Element ermittelt. Z.B. Wenn FontSize in dem Run Objekt nicht gesetzt ist wird diese von TextBlock genommen. Sobald die Eingenschaft gesetzt ist, gilt diese für Darstellung etc.
Reflection ist aus Performance Günden kommt als allerletzte Möglichkeit in Betrachtung.
@All: Seraph2402 hat mich auf die Lösung gebracht. Diese besteht darin, dass wenn der Text in der TextBox komplett (unter 2000 px) passt, wird der Text in mehrere Teile gesplittet und in einzelne Controls zugewiesen.
Also die RichtextBox scrollt schon. Wobei es wohl das ScrollViewer scrollt und nicht die RichtextBox selbst. Das Problem ist eben, dass der Inhalt der RichtextBoxnicht zu Ende angezeigt wird. Beim Scrollen kommt man nach ca. einem Drittel zu einem Punkt wo man die RichtextBox nicht mehr zu sehen ist. wobei man noch weiter runter scrollen kann.
ich habe ein Beispielprojekt angehängt um mein Problem zu verdeutlichen.
Zitat
...und/oder die RichtextBox aus dem Scope der ScollBar zu entfernen.
das habe ich jetzt nicht ganz verstanden..?
Ich will an der Stelle nochmal drauf hinweisen, dass es sich um eine WP7 Anwendung handelt.
ich habe ein Problem mit Anzeige einer Textdatei in einer RichtextBox in einer WP7 App.
Der Text wird einfach nicht ganz angezeigt. Vielleicht nur 10% der ganzen Datei.
XAML ist ganz einfach:
<Grid x:Name="LayoutRoot" Background="Transparent">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<!--TitlePanel enthält den Namen der Anwendung und den Seitentitel-->
<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="MEINE ANWENDUNG" Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="Seitenname" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<!--ContentPanel - zusätzliche Inhalte hier platzieren-->
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<ScrollViewer VerticalScrollBarVisibility="Auto" >
<RichTextBox Name="richTextBox" />
</ScrollViewer>
</Grid>
</Grid>
und befüllen:
RichTextBox _tb = richTextBox;
string _t = _be.Data.ToString(); // Text aus der Textdatei
Run _r = new Run();
_r.Text = _t.Trim();
Paragraph _pr = new Paragraph();
_pr.Inlines.Add(_r);
_tb.Blocks.Add(_pr);
Meine Suche nach der Ursache ergab leider keine Lösung.
Ich komme beim folgenden Problem leider nicht weiter.
Im Programm werden Spalten dynamisch erzeugt. Diese Spalten sollen Werte anzeigen, die in einer Config-Datei definiert werden. DataTemplate sieh eigentlich ganz einfach aus
Ich hatte schon längere Zeit vor, mein Visual Studio so zu konfigurieren, dass die Revision und Build in der AssemblyInfo.cs automatisch vergeben werden.
Die Build soll einfach hochgezählt werden, die Revison soll aus Subversion übernommen werden.
Nach „langer“ Suche, unter anderem auch hier im Forum, habe ich unten beschriebene Lösung "zusammengefunden". (An der Stelle sei erwähnt, dass ein paar Tipps von JuyJuka kamen.)
Ich dachte, dass meine Sucherei vielleicht jemandem noch nützt. in Form eines FAQ Beitrages, o.ä.
Die Beschreibung ist etwas größer geworden als ich dachte. Also Korrekturlesen wäre ganz angebracht.
Meine Umgebung:
- VS 2008/VS 2010 RC
- Subverion 1.6.9 (im Netzwerk, keine Lokale Installation)
Subversion Version soll dabei eigentlich keine Rolle spielen. Zumindest habe ich bei meiner Recherche diese gar nicht beachtet.
Versionsnummer soll im Format Major.Minor.Revision.Build erzeugt werden.
(nicht MS Format: Major.Minor.Build.Revision )
Als erstes muss man MSBuild Community Tasks installieren. Diese kann man von http://msbuildtasks.tigris.org/ runterladen. MSBuild Community Tasks ist Ansammlung von verschiedenen Tools, welche man in den Build Prozess einbinden kann.
Uns interessieren dabei nur drei der vielen nützlichen Tasks: Version, SvnVersion und AssemblyInfo
Version-Task hilft die Buildnummer des Projektes zu zählen, mit Hilfe von SvnVersion-Tasks werden wir die Revision des Projektes aus Subverion auslesen. AssemblyInfo erstellt dann eine AssemblyInvo.cs Datei mit den Versionsinformationen.
Nachdem die MSBuild Community Tasks installiert sind, muss man prüfen, ob ein SvnClient auf dem Rechner vorhanden ist. Diesen braucht man wegen der svnversion.exe. svnversion.exe wird von SvnVersion-Task benutzt, um wie oben bereits beschrieben, die Revision zu ermitteln. Wenn Subversion lokal installiert wurde, dann ist die svnversion.exe (ohne Gewähr ;) ) bereits vorhanden. Wenn nicht dann soll jetzt ein SvnClient drauf. Ich habe z.B. Silk Subverion Client benutzt (http://www.sliksvn.com/)
Nun wenn alle Voraussetzungen geschaffen sind, kommen wir zum nächsten Abschnitt: Anpassen der Projekt-Datei.
Man öffnet die C#-Projekt-Datei (*.csproj) in einem Text-Editor und geht ans Ende. Sieht etwa so aus (VS 2010)
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">
</Target>
<Target Name="AfterBuild">
</Target>
-->
</Project>
Zuerst muss man VisualStudio anweisen, die MSBuild Community Tasks zu benutzen. Dafür fügt man folgende „Anweisung“ ein
Attribut “Project” zeigt, wo die Community Tasks sich befinden (Standardinstallation)
“Condition” sorgt dafür, dass Projekt geladen werden kann, auch wenn die Community Tasks nicht installiert sind.
Im nächsten Schritt sorgen wir dafür, dass die Build-Nummer automatisch um eins erhöht wird.
Dafür ist Version-Task zuständig. Version-Task speichert in einer Datei die letzte Versionsnummer und erhöht die Build-Nummer bei jedem Aufruf um eins.
VersionFile gibt den Namen der Datei an, in der die Version gespeichert wird. Beim ersten Ausführen, wird eine neue Datei erstellt und Version 1.0.0.0 gespeichert. Zweite Ausgabe wäre dann 1.0.0.1, dann 1.0.0.2 usw.
RevisionType=“Increment“ bedeutet, dass die letzte Stelle (Revision nach MS Standard) der Versionsnummer inkrementiert wird.
Damit Projekt beim Kompilieren nicht angemeckert wird (wegen fehlender CommunityTasks), soll man eine Bedingung auch hier eingeben
Nach dem Ausführen des Version-Tasks sind Major, Minor, Build und Revision Variablen gesetzt und können weiter, z.B. durch andere Tasks, benutzt werden.
Nächster Part sorgt dafür, dass die Revisionsnummer aus SVN ausgelesen wird und erstellt eine AssemblyInfo.cs Datei.
Bei dem SvnVersion-Task muss Pfad zu dem Verzeichnis mit der svnversion.exe Datei eigegeben werden. Condition sollte selbst erklärend sein.
Interessant ist der Output-Tag. Der besagt, dass der Wert der Eigenschaft „Revision“ des SvnVersion-Tasks in der Variable „Build“ gespeichert werden soll.
Nun kommt der AssemblyInfo-Task endlich ins Spiel. Dieser Tasks erstellt aus den gegebenen Informationen eine Assemblyinfo.cs. Die Felder sind soweit selbsterklärend. Wichtig ist, dass die GUID durch eine eigene ersetzt wird und sich bei den einzelnen Projekten NICHT wiederholt.
Interessante Stellen sind AssemblyVersion/AssemblyFileVersion Eingaben. Die Version wird durch Variablen, welche Version und SvnVersion-Tasks vorbereitet haben, zusammen gesetzt.
Nach dem alle Tasks definiert wurde, bleibt noch zu sagen, wann diese aufgerufen werden sollen. Die AssemblyIfo.cs Datei soll vor dem Erstellen des Projektes erzeugt werden. Deshalb wird der Aufruf der Tasks folgendermaßen angegeben.
Die erzeugte Datei sieht dann, wie im Beispiel unten aus. Wictig ist, dass man die erzeugte AssemblyInfo Datei nicht manuell bearbeitet, denn sie wird bei jedem Build-Vorgang überschrieben.
Als letzter Strich, sollte man die entstandene "version.txt"-Datei auch zum Projekt hinzufügen. Damit wird die Datei auch in die Subversion Datenbank aufgenommen. Das ist wichtig, damit beim öffnen des Projektes auf einem anderen Rechner, die Build-Zählung nicht wieder von Vorne beginnt, sondern fortgesetzt wird.
@Kani und @Schlopp ist schon komisch... ich meine, ich hätte schwören können, dass ich eine x64 RC Version bei mir installiert habe. und jetzt finde ich nicht mal die Image Datei dazu. ich drehe wohl langsam durch 8o =)
Neue Option: Verhalten beim Ändern der Fälligkeit.
Beim Ändern der Fälligkeit wird die Änderung optional auf die Unteraufgaben übertragen
Bestätigung beim Löschen eines Filters
Schließen eines Tabs durch mitlere Maustaste
Contextmenu für Tabs mit Schließbefehlen.
Button (x) zum Schließen des aktiven Tabs in der Tableiste
Drag and Drop in der Tab-Leiste (Tab-Anordnung ändern: Alt+linke Maustaste)
Einstellungen für die Startseite
Darstellung der Aufgaben in der Liste nach unterschiedlichen Kriterien anpassbar.
Kriterien können über Konfiguration festgelegt werden.
FIX: Wenn man eine Aufgabe zu/auf klappt wird die in Editiermodus versetzt
FIX: Kategorie kann nicht gelöscht werden aus einer Aufgabe (Aufgabe ohne Kategorie)
Rahmen im Edit-Modus
Funktion zum Duplizieren der Aufgaben
Sperren einer Todo-Datei beim Öffnen. Die Datei kann durch einen anderen Benutzer nochmal
geöffnet werden. Es werden aber keine Änderungen gespeichert.
Speicherort für die Einstellungsdateien korrigiert.
Aus ..AppData\Local\Evely Todo-Manager nach ..AppData\Roaming\Evely Todo-Manager
Hinweis: Wegen der Änderungen des Speicherorts für die Einstellungsdateien werden die alten eingerichteten Filter nicht mehr angezeigt. Wenn man seine alte Filter haben möchte, kann die Datei filters.xml aus dem alten Speicherort (s. Changelog) nach das neue kopieren.
@CSL: ich warte wieder auf deinen ausführlichen Bericht :)
(und natürlich von allen anderen auch)
Zitat von CSL
Ich finde das schlecht, irgendwie finde ich es komisch das eine nicht übersetzte Applikation nur Deutsch ist anstatt Englisch.
ich habe nie behauptet, dass die nicht übersetzt ist. zur zeit werden drei Sprachen "gepflegt". Standard Sprache dabei ist Englisch. Sprache der Anwendung wird durch die Sprache des BS festgelegt. Später baue ich noch eine Sprachauswahl in die Konfiguration ein.
wobei du durch ein Interface nur erzwingen kannst, dass die Klasse etwas implementiert. Du kannst mit einem Interface nicht verhindern, dass zusätzlich etwas implementiert wird. Selbst wenn du im Interface nur get zu stehen hast, kann die Klasse trotzdem zusätzlich set implementieren.
das ist mir natürlich bewusst.
@winSharp93: über ein weiteres interface habe ich auch nachgedacht. mal sehen...
und eine Wrapper-Klasse, welche dieses Interface implementiert.
class SampleWrapper : ISample
{
public SampleWrapper(ISample managedObj) { ... }
public int State { get { return managedObj.State; } }
}
Die Anwendung bekommt Daten (ISample) von einer externen Datenquelle. Die Wrapper-Klasse gewährleistet gleiche Logik für die Datenverarbeitung der ISample-Objekte, unabhängig davon, wie die Klasse intern aufgebaut ist. alle Objekte der Anwendung greifen also auf ISample-Objekte indirekt über SampleWrapper
nun zu meinem Problem, alle Klassen/Objekte die auf ein ISample-Objekt zugreifen dürfen die State-Eigenschaft nicht beschreiben. Alle außer der Wrapper-Klasse selbst.
- Die Tabs, unter anderem Konfiguration sowie Filter Manager sind nur über das Projekt Menü schließbar, ist verwirrend, vor allem da Konfiguration ja kein Projekt ist
In nächstem Release implementiert: Schließen über mittlere Maustaste/Kontextmenü
Zitat
- Zuletzt geöffnet hat derzeit keine Funktion wenn die Applikation neu gestartet wird
was heißt das genau ????
Zitat
- Der untere Bereich minimiert nicht auf ein Minimum wenn alles zu geklappt wird
Dies ist mir bekannt. Kommt noch.
Zitat
- Man kann Unteraufgaben nicht mit der Tastatur auf und zu klappen
F12
Zitat
- Wenn man Unteraufgaben zu klappt werden will die Applikation die aufgabe darüber Editieren lassen
Fixed
Zitat
- Es ist alles Deutsch
Eh.. ist das gut oder schlecht? Es sind auch andere Sprachen geplant. Dabei brauche ich aber Unterstützung. Hättest du Lust dazu?
Zitat
- Im der Konfiguration sollte der Baum per Default aufgeklappt sein
Vermerkt.
Zitat
- Viel flackert ganz übel beim Resizen
8)
Zitat
- Wenn ich in der ComboBox oben etwas ein geben, (ich vermute das ist ein Filter) und Enter drücke, werden die Tasks gefiltert, das zurücksetzen des Filters funktioniert schlecht bis gar nicht
das ist ein Such-/Filterfeld. um Filter zu lösen, einfach das Feld leerer (markieren, ENTF)
Zitat
- Wenn ich Aufgaben auf klappe um ihre Unteraufgaben zu betrachten ist es wieder im Edit modus
- Wenn es nur eine Aufgabe gibt, und diese ist im Edit modus, kann man es nicht mit der Maus Read Only machen, nur die ESC Taste funktionierte
Fixed
Zitat
- Neustart der Applikation öffnet nicht automatisch die Listen die beim schließen verfügbar waren.
liegt daran, dass es noch gar nicht implementiert ist.
Zitat
- Es ist nicht deutlich genug wann immer gespeichert wird, es darf nicht gespeichert werden solange noch keine Undo Funktionalität zur Verfügung steht, sonst kann man sehr schnell seine Liste zerstören
Jede Änderung in der Liste wird sofort gespeichert. Dieses Verhalten gab's schon immer. ich weiß nicht ,ob ich noch was dran ändere. Die Undo/Redo Funktion habe ich auf meine Todo-Liste gesetzt
Zitat
..Nur im Edit-Modus gefällt es mir derzeit nicht, ich vermisse einen Rahmen.
Gibt's schon
Danke für den ausführlichen Feedback.
neuen Release werde ich diese spätestens nächste Woche zum Download freigeben.