Hallo,
die angehängte Version kann ein Backup von einem Verzeichnis erstellen. Änderungen im Quellverzeichnis werden sofort im Zielverzeichnis übernommen.
Um ein Backup ein zu richten müsst ihr die Datei C:\ProgramData\Get\FileSyncService\FileSyncServiceSettings.xml bearbeiten. Anbei ein Beispiel:
<?xml version="1.0" encoding="utf-8"?>
<FileSyncServiceSettings xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<SyncTaskList>
<SyncTaskList>
<Assembly>C:\Program Files\Get\FileSyncService\Plugins\FileSync.Plugin.IO.dll</Assembly>
<DirectoryToSync>\\10.51.51.3\martin\backup</DirectoryToSync>
<DirectorySource>C:\Users\martin\Desktop\AppDomain Isolated WPF Demo</DirectorySource>
<ExcludedFiles />
<UserName>martin</UserName>
<Password>*******</Password>
<Topic>gts - backup</Topic>
<Tag>True</Tag>
</SyncTaskList>
</SyncTaskList>
<RefreshInterval>00:00:00</RefreshInterval>
</FileSyncServiceSettings>
Die GUI und das FTP Plugin ist noch in arbeit.
Leider kann ich das Setup nicht anhängen da ich die 250KB überschreite.
Deshalb hier der Link zum Setup http://archiv.get-the-solution.net/media/file/10.07.25-FileSyncSetup.zip
Über Fehler, Tipps freue ich mich.
Hallo
Stand des Projektes
Der FileSyncService ist ein Windows Dienst der die verschiedenste Synchronisations -Plugins laden und ausführen kann. Ich habe ein Plugin für den FileSyncService (Windows-Dienst) geschrieben, der Verzeichnise in eine Richtung abbilden kann. Man kann z.B. den FileSyncService so einrichten, dass er ein lokales "Projekt-Verzeichnis" auf einen Netzwerkordner abbildet.
Da ein Dienst die Synchronisation übernimmt, werden Dateien nach einer Änderung im Quellverzeichnis sofort im Zielverzeichnis upgedatet.
Das FTP Plugin kann dazu verwendet werden, dass ein lokaler Ordner mit einer FTP Resource synchronisiert wird.
Man kann also ganz normal die Homepage lokal bearbeiten. Nach einer Änderung an der lokalen Homepage wird die Homepage im Internet sofort aktualisiert. Das lästige UP /Download mit einem FTP Clienten entfällt somit.
Die neuste Version kann hier heruntergeladen werden:
http://archiv.get-the-solution.net/media/file/10.07.27-FileSync.Setup.zip
Bitte beachtet die Hinweise im Post vom 27.07.2010.
Bugs und Verbesserungsvorschläge sind erwünscht.
Was man noch machen muss
-GUI (WPF) überarbeiten ist noch etwas verbuggt
-Plugins erstellen / überarbeiten
-FileSyncService (Windows-Dienst) überarbeiten
Bei Interesse / Fragen melde euch bei mir.
Achja, falls ihr irgendwelche Ideen habt, die zum Projekt passen gebt bescheid.
Noch ein paar Links:
http://archiv.get-the-solution.net/index-1-14-82-FileSyncService.html (mit Bilder)
http://archiv.get-the-solution.net/index-1-18
Das erste Template muss wie folgt aussehen:
<HierarchicalDataTemplate DataType="{x:Type local:AutoHaendler}">
<TextBlock Text="{Binding Path=Name}" FontWeight="Bold"/>
</HierarchicalDataTemplate>
Aber ich weiß einfach nicht wie ich vorgehen muss, dass wenn man auf einen Autohändler klickt, die Automarken angezeight werden. Hat niemand eine Idee?
Hallo,
ich habe XML Daten gegebene welche in einem TreeView angezeigt werden. Die Vorlage sieht so aus:
<Window x:Class="HierarchischeTemplatesXML.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:HierarchischeTemplatesXML"
Title="HierarischeTemplatesXML" Height="300" Width="300">
<Window.Resources>
<XmlDataProvider x:Key="haendler"
XPath="AutoHaendlerListe/AutoHaendler">
<x:XData>
<AutoHaendlerListe xmlns="">
<AutoHaendler Name="AutoBlitzBlank">
<AutoMarke MarkenTyp="VW">
<AutoModell Bezeichnung="Golf"/>
<AutoModell Bezeichnung="Passat"/>
<AutoModell Bezeichnung="Touareg"/>
</AutoMarke>
<AutoMarke MarkenTyp="Porsche">
<AutoModell Bezeichnung="Carrera"/>
<AutoModell Bezeichnung="Cayenne"/>
<AutoModell Bezeichnung="Cayman"/>
<AutoModell Bezeichnung="Boxter"/>
</AutoMarke>
</AutoHaendler>
<AutoHaendler Name="AutoFahrGut">
<AutoMarke MarkenTyp="Mercedes">
<AutoModell Bezeichnung="SLK"/>
<AutoModell Bezeichnung="190E"/>
</AutoMarke>
</AutoHaendler>
</AutoHaendlerListe>
</x:XData>
</XmlDataProvider>
<HierarchicalDataTemplate DataType="AutoHaendler"
ItemsSource="{Binding XPath=AutoMarke}">
<TextBlock Text="{Binding XPath=@Name}" FontSize="14" FontWeight="Bold" />
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="AutoMarke"
ItemsSource="{Binding XPath=AutoModell}">
<TextBlock Text="{Binding XPath=@MarkenTyp}" FontWeight="Bold"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="AutoModell">
<TextBlock Text="{Binding XPath=@Bezeichnung}"/>
</HierarchicalDataTemplate>
</Window.Resources>
<DockPanel>
<TreeView ItemsSource="{Binding Source={StaticResource haendler}}" DockPanel.Dock="Top"/>
</DockPanel>
</Window>
Nun ist es aber so, dass man hauptsächlich Templates für Klassen erstellt und nicht für XMLDataProvider. Zu diesem Anlass habe ich mir die XML Daten als Klasse nachgebaut:
public class VariantenList : ObservableCollection<Variante>
{
}
public class Variante
{
public Variante()
{
FahrplanperiodeList = new ObservableCollection<Fahrplanperiode>();
}
public string VariantenName { get; set; }
public ObservableCollection<Fahrplanperiode> FahrplanperiodeList { get; set; }
}
public class Fahrplanperiode
{
public Fahrplanperiode()
{
FahrplanperiodeList = new ObservableCollection<Fahrplanperiode>();
}
public string FahrplanName { get; set; }
public ObservableCollection<Fahrplanperiode> FahrplanperiodeList { get; set; }
}
public class Liniendescription
{
public Liniendescription()
{
}
public string LiniendescriptionName { get; set; }
}
Die Daten verwendet mit den Klassen, sehen genau gleich aus wie im XML Beispiel:
<local:AutoHaendlerList x:Key="AutoHaendlerList">
<local:AutoHaendler Name="AutoBlitzBlank">
<local:AutoHaendler.AutoMarkeList>
<local:AutoMarke MarkenTyp="VW">
<local:AutoMarke.AutoModelList>
<local:AutoModel Bezeichnung="Golf"></local:AutoModel>
<local:AutoModel Bezeichnung="Passat"></local:AutoModel>
<local:AutoModel Bezeichnung="Touareg"></local:AutoModel>
</local:AutoMarke.AutoModelList>
</local:AutoMarke>
<local:AutoMarke MarkenTyp="Porsche">
<local:AutoMarke.AutoModelList>
<local:AutoModel Bezeichnung="Carrera"></local:AutoModel>
<local:AutoModel Bezeichnung="Cayenne"></local:AutoModel>
<local:AutoModel Bezeichnung="Cayman"></local:AutoModel>
<local:AutoModel Bezeichnung="Boxter"></local:AutoModel>
</local:AutoMarke.AutoModelList>
</local:AutoMarke>
</local:AutoHaendler.AutoMarkeList>
</local:AutoHaendler>
<local:AutoHaendler Name="AutoFahrGut">
<local:AutoHaendler.AutoMarkeList>
<local:AutoMarke MarkenTyp="Mercedes">
<local:AutoMarke.AutoModelList>
<local:AutoModel Bezeichnung="SLK"></local:AutoModel>
<local:AutoModel Bezeichnung="190E"></local:AutoModel>
</local:AutoMarke.AutoModelList>
</local:AutoMarke>
</local:AutoHaendler.AutoMarkeList>
</local:AutoHaendler>
</local:AutoHaendlerList>
Das problem ist folgendes:
Ich habe verschiedenste Varianten im HierarchicalDataTemplate ausprobiert aber keine Funktioniert. Mir wird ledeglich ein "HierarchischesTemplateXML" im TreeView angezeigt. Hier mein Template:
<HierarchicalDataTemplate DataType="{x:Type local:AutoHaendlerList}">
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:AutoMarke}" ItemsSource="{Binding Source={x:Type local:AutoHaendler},Path=AutoMarkeList}">
<TextBlock Text="{Binding Path=MarkenTyp}" FontWeight="Bold"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:AutoModel}" ItemsSource="{Binding Source={x:Type local:AutoMarke},Path=AutoModelList}">
<TextBlock Text="{Binding Path=Bezeichnung}"/>
</HierarchicalDataTemplate>
Hat jemand eine Idee, warum mein Template nicht funktioniert bzw. nicht korrekt in der TreeView dargestellt wird?. Das Template sollte die Daten genau gleich anzeigen wie das obige Beispiel in der XML Variante. Hat jemand eine Idee wie man das Richtig anstellt?
Ich mag solche Fenster auch nicht.
Ich würde das PriorityBinding nehmen, mit gesetztem
Binding IsAsync=:::{style="color: darkred;"}"True"){darkred}
. So wird automatisch asyncron geladen.
Als Fortschrittsanzeige kannst du dann eine ganz einfacheProgressBar
in der UI verwenden.
Wie kann ich überprüfen ob im Hintergrund die Daten noch geladen werden?
[Edit]
Das geht einfacher als ich dachte:
<Style TargetType="{x:Type TextBlock}">
<Style.Triggers>
<DataTrigger Binding="{Binding ElementName=ZuüberorüfendeListBox,Path=ItemsSource}" Value="{x:Null}">
<Setter Property="Text" Value="lade"></Setter>
</DataTrigger>
</Style.Triggers>
</Style>
Hallo,
du kannst die Zahl über StringFormat formatieren. Dafür must du das SP1 installiert haben.
Mehr dazu siehe hier:
http://blogs.msdn.com/llobo/archive/2008/05/19/wpf-3-5-sp1-feature-stringformat.aspx
Oder du schreibst dir einen Converter, der die Zahl in das passende Format umwandelt.
Hallo,
ich will, dass man in der ListBox beliebig viele Items auswählen kann. Diese soll man dann per Drag and Drop in eine andere ListBox verschieben können.
Ich hab das folgender maßen realisiert:
void Window1_Loaded(object sender, RoutedEventArgs e)
{
_ListViewSource.AddHandler(ListBox.PreviewMouseDownEvent, new MouseButtonEventHandler(ListViewSource_MouseDown), true);
_ListViewTarget.Drop += new DragEventHandler(ListViewTarget_Drop);
}void ListViewTarget_Drop(object sender, DragEventArgs e)
{
ListView listview = sender as ListView;
if (e.Data != null)
{
ObservableCollection<object> list = e.Data.GetData(typeof(IList<string>)) as ObservableCollection<object>;
foreach (object o in list)
listview.Items.Add(o as string);
}
}
void ListViewSource_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
if ((sender as ListView) == null) return;
if ((sender as ListView).SelectedItems.Count.Equals(1))
return;
if (e.LeftButton.Equals(MouseButtonState.Pressed))
{
DataObject data = new DataObject(typeof(IList<string>), (sender as ListView).SelectedItems);
DragDrop.DoDragDrop(sender as ListView, data, DragDropEffects.Move);
//e.Handled = true;
}
}
Allerdings habe ich jetzt das Problem, dass ich einen Doppelklick machen muss um ein einzelnes Item zu selektieren. Das kommt daher, weil vor dem "Maus Klick" das DragDrop Event gestartet wird.
Wie kann ich dieses verhalten abstellen?
Ich hab dann da noch eine Variante probiert, bei der das DragDrop Event erst im Maus Move ausgelöst wird.
Aber auch hier habe ich das Problem, dass man dann 2 mal ein Item anklicken muss, damit es selektiert ist.
void ListViewSource_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
//System.Diagnostics.Debug.WriteLine("PreviewMouseDown" + e.ButtonState);
startPoint = e.GetPosition(null);
}
void ListViewSource_PreviewMouseMove(object sender, MouseEventArgs e)
{
//System.Diagnostics.Debug.WriteLine("MouseMove"+e.LeftButton);
Point mousePos = e.GetPosition(null);
Vector diff = startPoint - mousePos;
if (e.LeftButton == MouseButtonState.Pressed &&
Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance &&
Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
{
DataObject data = new DataObject(typeof(IList<string>), (sender as ListView).SelectedItems);
DragDrop.DoDragDrop(sender as ListView, data, DragDropEffects.Move);
}
}
Hat jemand eine Idee wie ich dieses Verhalten abstellen kann? Ich hab im Anhang 2 Demo Projekte in denen das Verhalten auftritt.
Hallo,
meine ListBox bindet auf eine Property. Diese Property ruft eine Funktion auf die eine XML Datei einliest um Daten für eine ListBox bereit zu stellen.
Da das einlesen sehr lange dauert, will ich ein Fenster öffnen welches den Benutzer über den Ladevorgang informiert. Nicht, dass er glaubt, die Anwendung sei abgeschmiert.
Wenn ich keinen BackgroundWorker oder zweiten Thread verwende, friert das ProgressBarWindow auch ein.
ProgressBarWindow.Show()
DatenLadenVonXML()
ProgressBarWindow.Close()
Deshalb will ich in einem zweiten Thread das ProgressBarWindow öffnen.
Den Ladevorgang kann ich nicht in den Thread packen, weil Thread.Start() keinen rückgabewert liefert.
Oder gibt es eine Möglichkeit, eine Funktion mit einem RückgabeWert in einen Thread auszulagern?
lg
Hallo,
wie muss ich im Backgroundworker ein WPF Fenster aufrufen?
Ich erhalte mit folgendem Code eine Exception:
Beim aufrufenden Thread muss es sich um einen STA-Thread handeln, da dies für viele Komponenten der Benutzeroberfläche erforderlich ist.
BackgroundWorker backgroundWorker = new BackgroundWorker() { WorkerReportsProgress = true, WorkerSupportsCancellation = true };
backgroundWorker.DoWork += (sender, e) =>
{
Window w = new Window();
w.Show();
};
backgroundWorker.RunWorkerAsync();
Ich hab auch schon probiert Window w = new Window(); w.Show(); in eine Statische Methode aus zu lagern.
lg
Danke das + und Regex.Matches hat mir weitergeholfen.
Hallo,
wie kann ich alle Zahlen per Regex aus einem String holen?
Angeommen ich habe folgenden Pattern:
"9406418i"
dann erhalte ich mit (\d) die erste Zahl. Ich weiß nicht wieviel Zahlen sich im string befinden. Somit weiß ich nicht ob ich 2x, 3x \d benötige. Gibt es da eine elegantere Methode?
lg
[Edit]
verschrieben
Was du in dem Fall suchst wäre ein Func<ClassA, ClassA> - rein kommt "ClassA" (der erste Typparameter), raus kommt "ClassA" (der letzte Typparameter).
Genau das habe ich gesucht!
Danke lg.
Hallo,
danke funktioniert.
Laut Doku muss dem Predicate übergebene Funktion einen boolschen Wert zurück geben. Was muss ich verwenden damit die übergebene Funktion objects zurück geben darf kann?
Hallo,
ich habe eine rekurisve Methode die ein Datenmodel durchläuft. Ich will, dass man dieser rekurisven Methode als Parameter eine Funktion mit übergeben kann.
Die übergebene Funktion soll Daten manipulieren.
Hier die rekursive Methode:
public static ClassA GoThroughClass(ClassA pClassA, Predicate<ClassA> pPredicate)
{
pPredicate(pClassA);
System.Diagnostics.Debug.WriteLine(pClassA.Propstring);
foreach (ClassA ca in pClassA.ClassAList)
GoThroughClass(ca, pPredicate);
return pClassA;
}
Die Extension bzw. die Funktion die ich übergebe und die Daten manipuliert sieht so aus:
public static ClassA AddText(ClassA pClassA)
{
pClassA.Propstring = pClassA.Propstring + " Cloned";
return pClassA;
}
Ich probiere die Funktion wie folt auf zu rufen.
GoThroughClass(classa, AddText(classa));
GoThroughClass(classa, AddText);
GoThroughClass(classa, AddText<ClassA>);
...
Ich erhalte aber immer die Fehlermeldung:
Error 1 The non-generic method 'LINQRekursion.Program.AddText(LINQRekursion.ClassA)' cannot be used with type arguments
mit GoThroughClass(classa, AddText<ClassA>);
Hat jemand eine Idee wie ich die Funktion übergeben muss?
Ich hab das Problem folgendermaßen gelöst.
1.) Kopie (Clone) des Datenmodel erstellen
2.) Datenmodel rekursiv durchlaufen
3.) In der Rekursiven Methode die Linq Abfrage durchführen.
Ist zwar nicht ganz das was ich wollte aber immerhin.
Die Kopie des Datenmodel erstell ich deshalb, weil das ergebnis Visuell dargestellt wird.
Ist ein Filter aktiviert wird unter umständen Teile des Datenmodels weggelassen bzw. entfernt. Wenn ich den Filter deaktivieren will, fehlen die Datenmodele, weil eben direkt an der Quelle die teile entfernt wurden.
Hallo,
ich habe einen Button und eine GroupBox mit der Eigenschaft Visibility.Collapsed. Wenn man auf den Button klickt, soll die GroupBox angezeigt werden. In der GroupBox ist nochmal ein Button mit Abbrechen und Ok. Jeweils beide sollen die GroupBox wieder auf Visibility.Collapsed setzen. Ich hab das derzeit im Codebehind geregelt. Gibts es eine reine XAML Lösnug? Ich habs mit Styles und Trigger probiert allerdings kann ich vom Button Style aus nicht die Visibility der GroupBox ändern.
Hat jemand eine Idee? Geht das überhaupt?
Zitat von winSharp93:
Hallo mfe,Alternativ sollte auch die Verwendung der Extensionmethod Any funktionieren:
C#-Code:
var query = from c in classes
where c.Propbool && c.ClassAList.Any(c2 => c2.Propbool)
select c;
Wenn ich das mit meinen Testdaten durchgehe und c2 wieder eine gefüllte ClassAList hat werden die Propertys mit diesem Ausdruck nicht beachtet. Die Liste beinhaltet auch Objekte von ClassA bei der die Property Propbool false ist. Das gleiche bei der Propery.
Ich hab im Internet ( http://mutable.net/blog/archive/2008/05/...-recursion.aspx ) folgende Extension gefunden:
:
static public IEnumerable<T> Descendants<T>(this IEnumerable<T> source,Func<T, IEnumerable<T>> DescendBy)
{
foreach (T value in source)
{
yield return value;
foreach (T child in DescendBy(value).Descendants<T>(DescendBy))
{
yield return child;
}
}
}
Mit dieser Extension wird rekursiv mein Datenmodel durchlaufen.
var x = from c in classa.ClassAList.Descendants(c=>c.ClassAList)
where c.Propbool == false
select c;
Fast das was ich brauche. Allerdings zerstört sie meine Struktur und fügt alle ClassA mit der Bedienung c.Probool = false in eine Liste ein.
Ich weiß nicht wie ich die Extension umschreiben muss, dass die Struktur beibehalten wird, aber alle ClassA mit der Bedienung X "rausgeschmissen" werden.
verwendetes Datenbanksystem: LINQ2Object
Hallo,
ich habe eine Klasse A in der eine List entalten ist vom Typ Klasse A. Die sieht so aus:
public class ClassA
{
public ClassA()
{
ClassAList = new ObservableCollection<ClassA>();
}
public string Propstring { get; set; }
public bool Propbool { get; set; }
public ObservableCollection<ClassA> ClassAList { get; set; }
public override string ToString()
{
return Propstring + " ClassA ";
}
}
Mit einer normalen Linq abfrage kann ich in einer Where Klausel die Unter Klassen die in der ClassAList gespeichert sind NICHT einbeziehen.
Ich bräuchte einen rekursiven Methoden aufruf um alle Klassen A zu überprüfen.
Wenn ich jetzt z.B. nur die ClassA selecten möchte bei der die Eigenschaft Propbool = true ist, werden die ClassA in der Liste nicht berücksichtigt. Ich hoffe ihr versteht was ich meine.
Hat jemand eine Idee wie ich das in Linq realisieren kann?
Hallo,
probiers mal mit
...BasedOn={StaticResource {x:Type GroupBox}}
Eine zeitlang habe ich es mit dieser Variante probiert.
...
Sowas wie IsSelected hat der TextBlock nicht.Geht doch schon in die richtige Richtung. Schau dir mal das Property ItemTemplateSelector der ListBox an. [...]
Hallo,
dein Beitrag hat mir sehr weitergeholfen. Ich hab das jetzt viel einfacher hinbekommen ohne ItemTemplateSelector etc.
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" >
<TextBlock x:Name="Artikelname" Text="{Binding Path=Name}"></TextBlock>
<TextBlock x:Name="Foto" Text="{Binding Path=Foto}"></TextBlock>
</StackPanel>
<DataTemplate.Triggers>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type ListBoxItem}}, Path=IsSelected}" Value="True">>
<Setter TargetName="Foto" Property="Visibility" Value="Visible"></Setter>
</DataTrigger>
</DataTemplate.Triggers>
</DataTemplate>
Entscheidend ist der DataTrigger.
Hallo,
ich habe eine Listbox gefüllt mit Daten. Ich möchte, dass beim SelectedItem zusatz Informationen angezeigt werden.
Die Daten haben diese Struktur:
public class Class
{
public string Artikelname { get; set; }
public string Foto { get; set; }
}
In der Listbox soll nur der Artikelname angezeigt werden. Beim SelectedItem soll zusätzlich das Foto mit angezeigt werden.
Zuerst habe ich mich an diesen Artikel orientiert.
http://blog.norberteder.com/index.php?entry=entry080529-211725
Dann werden aber bei allen Items die Zusatzinformationen angezeigt.
Eine zeitlang habe ich es mit dieser Variante probiert.
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Vertical" >
<TextBlock x:Name="Artikelname" Text="{Binding Path=Name}"></TextBlock>
<TextBlock x:Name="Foto" Text="{Binding Path=Foto}"></TextBlock>
</StackPanel>
<DataTemplate.Triggers>
<Trigger SourceName="Artikelname" Property="IsMouseOver" Value="True">
<Setter TargetName="Foto" Property="Visibility" Value="Visible"></Setter>
</Trigger>
</DataTemplate.Triggers>
</DataTemplate>
Leider funktioniert das nur, wenn man mit der Maus über dem Artikelnamen ist. Sowas wie IsSelected hat der TextBlock nicht.
Momentan probier ich es hiermit:
<DataTemplate DataType="{x:Type local:Class}">
<TextBlock Text="{Binding Artikelname}"></TextBlock>
</DataTemplate>
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type ListBoxItem}">
<StackPanel>
<Border Name="Border">
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Content="{TemplateBinding Content}" ContentTemplate="{TemplateBinding ContentTemplate}"/>
</Border>
<TextBlock x:Name="Foto" Text="hier will ich auf das Property Foto von der Class binden" Visibility="Collapsed"></TextBlock>
</StackPanel>
<ControlTemplate.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter TargetName="Border" Property="Background" Value="Blue"/>
<Setter TargetName="Foto" Property="Visibility" Value="Visible"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
Das Problem bei diesem Beispiel ist, dass der ContentPresenter im Content den Artikelnamen hat. Ich kann also nicht auf das Property Foto zugreifen, da ich diese im DataTemplate nicht mit übergebe bzw. anzeige.
Hat jemand eine Idee, was ich noch probieren könnte?
Hallo,
vlt hilft dir dieses Beispiel weiter. http://blog.functionalfun.net/2008/09/how-to-create-gantt-control-in-wpf.html
Dort wird die größe des GanttRowPanel auc über Measure und DesiredSize berechnet.
Hallo,
vlt hilft dir das weiter:
http://blogs.msdn.com/mikehillberg/archive/2008/09/30/ComparableDataTrigger.aspx
mit dem Stichwort MutliTrigger.
Für die TextBox würd ich eine seperate Propertie anlegen (auf die du zugreifen kannst) die von der TextBox die Lenght zurück gibt.
Hallo,
für den einstieg in WPF habe ich die Bücher
WPF das umfassende Handbuch
http://www.galileocomputing.de/katalog/b...gp/titelID-1615
und
Sams Windows Presentation Foundation
http://www.amazon.de/Windows-Presentatio...6062030&sr=8-16
verwendet. Ich kann beide Bücher nur empfehlen. Das Buch vom Galileo Verlag behandelt das neue .NET 3.5 in der Sprache C# und ein wenig XAML. Es behandelt neue Elemente des .NET wie zum Beispiel Dependency Properties, Routed-Events,Converter Markup-Extensions, die neuen StanardControls...
Sams Windows Presentation Foundation befasst sich ausschließlich mit XAML.
Ich kann beide Bücher weiter empfehlen.
Hallo,
ich habe viele Controls mit der man z.B. FilterAktionen durchführen kann. Diese möchte ich in eine Ressource Dictionary auslagern. Damit ich Sie später leicht wiederverwenden kann.
Ich hab das so gemacht:
DataTemplate in dem ich die "Controls" speichere.
<Window.Resources>
<DataTemplate x:Key="Header">
<Border Grid.Row="0" Style="{DynamicResource BorderStyleBlack}">
<TextBlock Style="{DynamicResource FerienHeaderStyle}">Ferien</TextBlock>
</Border>
</DataTemplate>
</Window.Resources>
Controls "laden"
<ItemsControl ItemTemplate="{DynamicResource Header}" ></ItemsControl>
Das Funktioniert aber nicht. Ich bekomme auch kein binding Express Error. Muss ich das anderst anstellen?
lg
Hallo,
ich will bei
DataType="{x:Type local:DataDetail}">
folgenden Typ angeben:
Calender.CalenderS.DataDetail
Ich erhalte aber immer die Meldung:
The type reference cannot find a public type named 'DataDetail'.
Die Meldung, so gehe ich aus, kommt daher, dass DataDetail sich in einer weiteren Klasse befindet. Ich weiß nicht wie ich das angeben soll, den bei:
xmlns:local="clr-namespace:Calender;assembly=Calender.CalenderS">
,
DataType="{x:Type local:CalenderS.DataDetail}">
und
DataType="{x:Type local.CalenderS:DataDetail}">
erhalte ich die gleiche Fehlermeldung.
Hier der komplette Code:
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Calender;assembly=Calender">
<DataTemplate x:Key="myTaskTemplate" DataType="{x:Type local:DataDetail}">
[..]
</DataTemplate>
</ResourceDictionary>
Wie kann ich beim Typ die Klasse DataDetail angeben, welche eine unterklasse von CalenderS ist.? Hat jemand eine Idee?
lg
Hallo,
ich arbeite mich gerade in WPF und .NET 3.0 ein. Ich bin gerade dabei, ein eigenes Control zu entwerfen und habe zu FrameworkElement..::.MeasureOverride-Methode eine Frage.
Es heißt:
Misst beim Überschreiben in einer abgeleiteten Klasse die Größe im für untergeordnete Elemente erforderlichen Layout und bestimmt eine Größe für die abgeleitete FrameworkElement-Klasse.
MSDN: FrameworkElement.MeasureOverride-Methode
Ich werd daraus nicht ganz schlau. Muss diese Funktion, die Größe (Size) zurückgeben, die den untergeordneten Controls zu verfügung steht.
Das Beispiel das ich im Internet gefunden habe sieht so aus:
protected override Size MeasureOverride(Size availableSize)
{
foreach (UIElement child in Children)
{
//Aktualisiert die DesiredSize eines UIElement. Übergeordnete Elemente rufen diese //Methode aus ihren eigenen MeasureCore-Implementierungen auf, um eine //rekursive Layoutaktualisierung auszuführen. Das Aufrufen dieser Methode stellt die //erste Übergabe (die "Maßübergabe") einer Layoutaktualisierung dar.
child.Measure(availableSize);
}
return new Size(0,0);
}
Müsste ich da nicht die größe der untergeordneten Elemente holen, zusammenzählen-dem Übergeordneten und zurückgeben um die verfügbare Größe zurück geben zu können?
Kann mich jemand bitte aufklären?