da bin ich wieder.
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.
Hi,
ich suche nach "bester" Lösung für folgendes Problem.
Es gibt ein Objekt Person. Dieses Objekt enthält Beziehungen zu anderen Person Objekten.
class Person {
ind id;
List<Person> children;
List<Person> parents;
}
die Objekte werden in eine XML Datei gespeichert. etwa so:
<xml>
<Person>
<id>1</1>
<Children>
<Person id="3" />
<Person id="4" />
</Children>
<Partens>
<Person id="2" />
</Partens>
</Person>
<Person>
<id>2</1>
<Children>
<Person id="1" />
</Children>
</Person>
<Person>
<id>3</1>
<Partens>
<Person id="1" />
</Partens>
</Person>
<Person>
<id>4</1>
<Partens>
<Person id="1" />
</Partens>
<Children>
<Person id="5" />
</Children>
</Person>
<Person>
<id>5</1>
</Person>
</xml>
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.
Oder noch weitere Vorschläge?
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.
Bleibt also die HashSet Variante.
Wie kann man in nach hinein feststellen, ob eine DependencyProperty gesetzt wurde?
Also, ob ein Wert zugewiesen wurde?
Konkret geht es mir darum ein Run-Objekt zu kopieren. Es sollen nur die Eigenschaften kopiert werden, die auch wirklich gesetzt wurden.
@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.
Sieh auch hier: http://blogs.msdn.com/b/priozersk/archive/2010/09/08/creating-scrollable-textblock-for-wp7.aspx
@Seraph2402: Also das mit 2000px klingt plausibel. 2000px konnte es durchaus sein.
Nun wie geht man das Problem um? Richtextbox soll doch mal ein komplettes File zeigen können. Ist absolut unverständlich 😦
@winSharp93: ohne ScrollViewer habe ich schon mal probiert. Dabei wird gar nicht mehr gescrollt.
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.
...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.
Hallo,
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.
Hi,
ich habe letztendlich mich damit abfinden müssen, Template zur Laufzeit im Code zu erstellen.
so etwa:
public class DateColumnBuilder : BaseColumnBuilder
{
protected override DataGridColumn OnBuildColumn()
{
if (this.ValueConverter != null)
if (!Application.Current.Resources.Contains(this.ValueConverter.ToString()))
Application.Current.Resources.Add(this.ValueConverter.ToString(), this.ValueConverter);
DataGridTemplateColumn column = new DataGridTemplateColumn();
// template for column cell editor
string template = string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<DatePicker BorderThickness=""0"" SelectedDate=""{{Binding Path=[{0}]}}"" /></DataTemplate>", this.Field);
column.CellEditingTemplate = (System.Windows.DataTemplate)XamlReader.Parse(template);
// template for column cell
template = string.Format(@"<DataTemplate xmlns=""http://schemas.microsoft.com/winfx/2006/xaml/presentation"">
<TextBlock HorizontalAlignment=""Right"">
<TextBlock.Text>
<Binding Converter=""{{StaticResource XXX.XXX.DateConverter}}"">
<Binding.Path>[{0}]</Binding.Path>", this.Field);
if (!string.IsNullOrEmpty(this.Format))
{
template += string.Format("<Binding.ConverterParameter>{0}</Binding.ConverterParameter>", this.Format);
if (this.ValueConverter != null)
template += string.Format("<Binding.StringFormat>{0}</Binding.StringFormat>", this.Format);
}
template += "</Binding></TextBlock.Text></TextBlock></DataTemplate>";
column.CellTemplate = (System.Windows.DataTemplate)XamlReader.Parse(template);
return column;
}
}
Hi,
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
<DataTemplate x:Key="ColumnTemplate">
<TextBox BorderThickness="0"/>
</DataTemplate>
Die werte sollen also in der TextBox angezeigt werden. Mein Problem ist nun, wie binde ich die TextBox an meine Daten Quelle?
DataTemplate wird aus eine Ressource-Datei geladen.
Daten Objekt sieht etwa so aus
class DataObject
{
object this[string propName] { get; set; }
}
wenn ich DataTemplate z.B. etwa so verändere
<DataTemplate x:Key="ColumnTemplate">
<TextBox BorderThickness="0" Text="{Binding Path=[Status]}"/>
</DataTemplate>
wird Status angezeigt.
Das ist aber gerade mein Problem, dass ich nicht weiß welche Eigenschaften ein Objekt besitzt.
vllt. ist das auch ganz einfaches Problem, für WPF-Profis wie euch 😃