Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von BJA-CH
Thema: Schnelle Datenübergabe an Steuerelement
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo,
Ja habe ich selber geschrieben. Wie du siehst, ist das nicht ganz einfach.... aber man kann viel lernen dabei.
Nun, das was "Abt" geantwortet hat hört sich spannend an, denn diese Methoden kenne ich noch gar nicht.

Ich frage mich nun auch, ob ich wirklich mit eintreffen eines Messpunktes das Chart auch wirklich aktualisieren muss, oder ob ich vielleicht besser mit einer Frame-Rate eine kontinuierlicghe Aktualisierung erzwingen soll. Das müsste doch für das Auge auch reichen und würde den Computer sicherlich entlasten....

Danke für deinen Hinweis auf "LiveCharts2", das scheue ich mir gerne mal an.

Gruss, Jakob

Thema: Schnelle Datenübergabe an Steuerelement
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hallo zusammen
Ich bin mir nicht sicher, ob ich hier im richtigen Forum bin, aber ich hoffe man kann mich gleichwohl verstehen.

Ich möchte analoge Daten vom Mikroprozessorsystem "Arduino" einlesen und an einem selbstgebauten Steuerelement, das ich Oszillator" (siehe Bild im Anhang) nenne dynamisch anzeigen lassen.
Ich kann die Daten im Programm aufnehmen. Ich kopiere das Messergebnis in eine kleine Klasse und füge eine fortlaufende Nummer zur Kontrolle dazu. Dann übergebe ich dieses Objekt an das Steuerelement, also ein Messpunkt nach dem anderen.
In einem DependencyProperty übernehme ich dieses Objekt und füge den Messwert in eine ObservableCollection<double>-Liste. Danach kicke ich eine Dispatcher die Darstellungs-Routine an.
Das Ergebnis ist sehr unbefriedigend, denn das angezeigte Signal entspricht in keiner Weise dem Signal des Arduino.

Wenn ich aber die Dateneingänge des Steuerelementes überprüfe, so sehe ich, dass nur ein kleiner Teil der Signale das Steuerelement erreichen, dies obwohl der einlesende Programmteile den Messwert empfängt und an das Steuerelement weiterleitet. Ich weiss, die Darstellung des Signales benötigt viel Rechenaufwand, da jedes Mal die Bildschirmbreite neu gezeichnet wird. Aber selbst, wenn ich die Darstellung des Signales ganz abschalte, werden nicht alle Signale empfangen.

Für mich sieht es aus, als ob das Steuerelement mit einer anderen Priorität arbeitet als das Hauptprogramm.

Nun, und da fängt meine Unkenntnisse an, wie müsste ich ein solches Vorhaben in Prozesse (Threads) aufteilen, damit alles Wichtige möglichst schnell bearbeitet werden kann?
Muss ich das Steuerelement mit dem Einlese-Teil in eine prioritären Thread setzen und wie würde dies geschehen?
Wie muss ich das Zeichnen der Signals vom Einlese-Teil mit einem eigenen Prozess (Thread) trennen, damit das Einlesen möglichst nicht gestört wird?

Hat jemand Erfahrung mit einem solchen Steuerelement? Oder kann mir jemand eine Idee skizzieren, wie ich das hinkriegen könnte?

Besten Dank für eure Beiträge
Jakob

Thema: Nnach Windows 10 Update wird die Polyline nicht mehr angezeigt.
Am im Forum: GUI: WPF und XAML

Ich habe keine andere Framework verwendet. Arbeite mit der Version 4.7.1
Ich gehe davon, dass das Update irgendwas verändert hat.

Thema: Nnach Windows 10 Update wird die Polyline nicht mehr angezeigt.
Am im Forum: GUI: WPF und XAML

Also, eine Antwort kann ich selber schon geben.
Bei der Polyline-Shape gibt es offenbar die String-Liste für die Stützpunkte nicht mehr. Neu muss offenbar eine PointCollection mit den Stützpunkten in Points gemacht werden.

Nun muss ich wohl meine Frage an euch anders stellen. Was hat denn sonst alles strukturelles noch verändert? Wo finde ich eine Zusammenstellungen aller Veränderungen, welche offenbar das neueste Framework-Update beinhaltet?

Danke!!

Thema: Nnach Windows 10 Update wird die Polyline nicht mehr angezeigt.
Am im Forum: GUI: WPF und XAML

Hallo,
heute hat es mir das Windows 10 Update 10.0.18342.8 (19h1_relaese) eingespielt. Nun scheinen gewisse Funktionen. So wie es scheint sind es Funktionen im System.Windows.Shapes;PresentationFramework.dll.

Ich habe zum Beispiel ein Polyline in einem DatenTemplate, welches aus einem ItemsControl aufgerufwen wird. Das sieht etwa so:

        <DataTemplate DataType="{x:Type kli:itemsPlanetBahn}">
            <Polyline Points="{Binding Path=Points}" Stroke="{Binding Path=ColorObjekt}" StrokeThickness="{Binding Path=Thickness}"
                      ToolTipService.IsEnabled="{Binding ElementName=sternToolTip, Path=IsChecked}">
            </Polyline>
        </DataTemplate>

Vor dem Windows-Update bzw. auf PCs ohne diesem Update läuft alles richtig. Jetzt wird die Polyline nicht mehr angezegt. Ein
        <DataTemplate DataType="{x:Type kli:itemsCanvasRund}">
            <ItemsControl ItemsSource="{Binding Path=ItemsListe}"
                          Width="{Binding Path=CanvasSize.Width}" Height="{Binding Path=CanvasSize.Height}"
                          Background="{Binding Path=ColorObjekt}"
                          ClipToBounds="True">
                <ItemsControl.Clip>
                    <EllipseGeometry RadiusX="{Binding Path=Radius}"
                                     RadiusY="{Binding Path=Radius}"
                                     Center="{Binding Path=Center}"/>
                </ItemsControl.Clip>
            </ItemsControl>
        </DataTemplate>
läuft gar nicht mehr, das Programm hängt sich auf.

Weiss jemand über solche Probleme? Weiss jemand, woran dies liegen kann?

Danke für eure Hilfe!!

Thema: Grösse eines Bildes aus einem DataTemplate zurückgeben
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich binde in ein DataTemplate (ItemsControl) eine Image, deren Grösse ich nicht kenne. Nun habe ich versucht das ActualHeight-Property abzufangen. Ich habe dies so versucht:

  <DataTemplate DataType="{x:Type kli:itemsKarte}">
            <Image Name="image" Source="{Binding Path=ImageDatei}" 
                   HorizontalAlignment="Left" VerticalAlignment="Top"
                   Width="{Binding Path=FensterSize.Width}" Height="{Binding Path=FensterSize.Height}">
                <i:Interaction.Triggers>
                    <i:EventTrigger EventName="SizeChanged">
                        <i:InvokeCommandAction Command="{Binding DataContext.KarteSizeChangedCommand, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" 
                                               CommandParameter="{Binding ElementName=image, Path=ActualHeight}"/>
                    </i:EventTrigger>
                </i:Interaction.Triggers>
            </Image>
        </DataTemplate>

Aber irgendwie will das nicht richtig funktionieren.
Weiss jemand, wie ich die Grösse des Images abfragen kann?
Besten Dank

Thema: ItemsControl: Template Datenbindung an Property ausserhalb der Source
Am im Forum: GUI: WPF und XAML

Hallo MarsStein
Super, habe ich verstanden und hat auch geklappt!
Besten Dank

Thema: ItemsControl: Template Datenbindung an Property ausserhalb der Source
Am im Forum: GUI: WPF und XAML

Hallo zäme
Ich habe ein ItemsControl, bei dem ich die darzustellenden Daten in einem ObservableControl<> übergebe.
Nun möchte ich aber, einige Darstellungsattribute, wie Strichdicke, Farbe usw. durch den Benutzer steuern lassen. Dazu habe ich in der aufrufenden MVVM-Klasse die entsprechenden Properties bereitgestellt.
Nun möchte ich eine Datenbindung in einige ausgewählte DataTemplate machen. Ich denke das müsste mit RelativeSource FindAncestor zu machen sein, doch das bekomme ich einfach nicht hin.
Ich habe es bis jetzt wie folgt versucht:

        <DataTemplate DataType="{x:Type kli:itemsSternbild}">
            <Line Stroke="{Binding Path=SternbildColor, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type vm:MainWindowViewModel}}}" StrokeThickness="{Binding Path=Thickness}"
                  X1="{Binding Path=X1}" Y1="{Binding Path=Y1}" X2="{Binding Path=X2}" Y2="{Binding Path=Y2}"
                  Visibility="{Binding ElementName=starBilderAnzeige , Path=IsChecked, Converter={StaticResource boolToVisibilityConverter}}"
                  ToolTipService.IsEnabled="{Binding ElementName=sternToolTip, Path=IsChecked}">

wobei "SternbildColor" das Property wäre und dieses liegt in der Hauptdatei "vm:MainWindowViewModel".

Weiss da jemand Rat??

Thema: Darstellung von Objekten im Canvas mit MVVM
Am im Forum: GUI: WPF und XAML

MrSparkle, ich habe eine Frage an deinen Beitrag zu meinem Problem.
Es ist richtig, ich kann ActualHeight und ActualWidth in das ViewModel holen (binden) und dort die Umrechnung auf die Pixel machen. Das funktioniert sogar. Hat aber den Nachteil. dass bei einer "SizeChanged" alles per Code nachgerechnet werden muss.
Sehe ich dies falsch?
Ich denke nur, wenn das Konzept nun "binden zum Teufel komm raus" heissen soll, so müsste doch die Grösse der Zeichnungsfläche auch gebunden sein. So aber muss ich nun ein Code schreiben, der bei einer Veränderung der Fenstergrösse die Position und Grösse jedes Objektes nachrechnen...

Thema: Darstellung von Objekten im Canvas mit MVVM
Am im Forum: GUI: WPF und XAML

OK, also ich nehme mir nun die Zeit und baue meinen "Himmel" um. Ich sehe den Vorteil, dass, wenn es klappt, ein Benutzersteuerelement nicht nötig sein wird, da einiges einfacher werden wird.
Einiges läuft schon... aber bis nur ein schreibgeschütztes ActualWidth und ActualHeight angebunden war... aber geschafft!

Nun habe ich noch ein Frage. Wie in meinem Bild ersichtlich verwende ich ja nicht bloss ein grafisches Element im Bild. Ich benötige Kreise (Ellipsen), Linie, TextBlock und Polyline.
Gibt es eine Möglichkeit im DataTemplate des ItemsControl eine Weiche einzubauen, mit der jeweilige Control-Typ ausgewählt werden kann? Oder baut man pro Control-Typ (Ellipse, Linie... ) ein eigenes ItemsControl ein?
Alle Beispiele, welche ich gefunden habe die verwenden für alle Elemente den gleichen Control-Typ und meinst nur ein TextBlock...

Thema: Darstellung von Objekten im Canvas mit MVVM
Am im Forum: GUI: WPF und XAML

So den Anhang habe ich nun auch gepackt.... 256KB sind halt wirklich nicht mehr viel... Hoffe man kann noch was erkennen...

Thema: Darstellung von Objekten im Canvas mit MVVM
Am im Forum: GUI: WPF und XAML

Danke alle für eure Antwort.
Aber nun habe ich einen Knopf. Was ist nun View (Ansicht) und was ist ViewModel (Datensicht),
Meine Überlegung war, die physikalische Bedeutung der Daten gehört ins ViewModel, da es die Datensicht bedeutet. Die Umrechnung der Daten auf die momentane Fenstergrösse gehört zur Ansicht. Habe ich da dann doch was Falsches verstanden?
Wenn dem nicht so ist, dann sehe ich den Nutzen einer solchen "Verkomplizierung" nicht.... Ich meine ich habe den Sternenhimmel mit allen Zusatzkomponenten ganz normal in einer Benutzersteuerelement gebaut... und mir scheint, es ist auch nicht die schlechteste Lösung...
Stelle mal ein Bild in den Anhang...

Thema: Darstellung von Objekten im Canvas mit MVVM
Am im Forum: GUI: WPF und XAML

Also ich habe da mal einen Versuch gemacht, wie ich meine Planeten in einem Canvas mit beliebiger Grösse darstellen kann.
Mein versuch sieht so aus:

            <!--Testbeispiel Plaenten-->
            <ItemsControl Name="canvasPlaneten" ItemsSource="{Binding Path=ItemsPlanetes}"
                          Width="400" Height="200" Background="LightBlue">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <Canvas/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemContainerStyle>
                    <Style TargetType="ContentPresenter">
                        <Setter Property="Canvas.Left">
                            <Setter.Value>
                                <MultiBinding Converter="{StaticResource posRaConverter}">
                                    <Binding Path="Ra"/>
                                    <Binding ElementName="canvasPlaneten" Path="ActualWidth"/>
                                    <Binding ElementName="canvasPlaneten" Path="ActualHeight"/>
                                    <Binding Path="Radius"/>
                                </MultiBinding>
                            </Setter.Value>
                        </Setter>
                        <Setter Property="Canvas.Top">
                            <Setter.Value>
                                <MultiBinding Converter="{StaticResource posDecConverter}">
                                    <Binding Path="Dec"/>
                                    <Binding ElementName="canvasPlaneten" Path="ActualWidth"/>
                                    <Binding ElementName="canvasPlaneten" Path="ActualHeight"/>
                                    <Binding Path="Radius"/>
                                </MultiBinding>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </ItemsControl.ItemContainerStyle>
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <Ellipse Height="{Binding Radius}" Width="{Binding Radius}" Fill="{Binding Color}" Stroke="{Binding Color}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>

Also MultiValueConverter für die Berechnung der Position im Canvas habe ich folgende Klasse gebildet (Beispiel Rektaszension):

        public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
        {
            double _height100 = 845;
            double _width100 = 1620;

            double ra = System.Convert.ToDouble(values[0]);
            double width = System.Convert.ToDouble(values[1]);
            double height = System.Convert.ToDouble(values[2]);
            double radius = System.Convert.ToDouble(values[3]);

            double faktorHeight = height / _height100;
            double faktorWidth = width / _width100;
            double faktor = faktorHeight < faktorWidth ? faktorHeight : faktorWidth;

            return (width / 24.0 * (24.0 - ra) - (radius * faktor));
        }

Läuft eigentlich erstaunlich gut, so wie MrSparkle vorausgesagt hat.
Was ich nun aber nicht hinkriege ist die aktuelle Grösse der Canvas-Fläche zu meinem Converter zu bringen.
Deshlab nun meine Fragem:
a) Woher nehme ich die aktuelle Grösse der Zeichenfläche;
b) Ist dieser erste Ansatz für eine dynamische MMVM-Canvas-Darstellung richtig?

Danke für eure Hilfe!

Thema: Standardwert für Eigenschaft mit leerer Klasse
Am im Forum: GUI: WPF und XAML

Hallo zäme
Ich verstehe in der Zwischenzeit das Konzept von MVVM. Über die wirklichen Vorteile bin ich mir noch nicht ganz klar. Aber sicher wäre eine einheitliche Arbeitsweise ein guter Grund konsequent dies umzusetzen.

Wie sieht es aber bei "Benutzersteuerelementen" (UserDefinedControls) aus. Ich habe ein Control gebaut, das in der View drei geschachtelte Canvas-Elemente besitzt sonst aber nichts.
Ich schreibe direkt in diese Canvas und platziere dort weitere Controls. Macht es da nun wirklich Sinn, den Code in ein ViewModel auszulagern. Er wird dort ja genau gleich aussehen, wie wenn ich diesen direkt im UserDefinedControl belasse.
Ja eigentlich würde er ja noch etwas komplizierter werden, weil ich ja die Vanvas-Flächen über ein Property an das ViewModel übergeben müsste.

Wie müsste man dies effektiv gestalten, wenn ich aus einer ViewModel-Klasse in ein Canvas schreiben möchte, das in der View liegt?
Entweder betrachte ich dies viel zu kompliziert oder schaue hier nicht ganz durch!

Wer kann mir da eine gescheite Anwort geben???

Thema: Standardwert für Eigenschaft mit leerer Klasse
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich komme da bei einer Sache nicht weiter.
Ich habe ein DependencyProperty aufgebaut, welche ein Element einer Klasse beinhaltet. Als Standartwert möchte ich eine leere Klasse erzeugen und übergeben.
Das habe ich so gelöst (Ausschnitt):



        public static readonly DependencyProperty MitPlanetenProperty =
            DependencyProperty.Register("MitPlaneten", typeof(planetenSicht), typeof(HimmelControl),
                new FrameworkPropertyMetadata(new planetenSicht(), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnMitPlanetenPropertyChanged)));

        public planetenSicht MitPlaneten
        {
            get { return (planetenSicht)GetValue(MitPlanetenProperty); }
            set { SetValue(MitPlanetenProperty, value); }
        }
Dazu habe ich, wie oben ersichtlich, im FrameworkPropertyMetadata den Standartwert "new planetenSicht()" übergeben.

Hier ein kurzer Blick in die Klasse "planetenSicht":



namespace UserDefinedControls.Klassen
{
    public class planetenSicht : DependencyObject, INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;

        private bool _mitMerkur = false;
        private bool _mitVenus = false;
        private bool _mitErde = false;
….
        public planetenSicht()
        { }

        public bool MitMerkur
        {
            get { return this._mitMerkur; }
            set
            {
                this._mitMerkur = value;
                this._anzeigePlaneten[1] = value;
                this.RaisePropertyChanged("MitMerkur");
            }
        }
….
Als Ergebnis bekomme ich dann aber einen Laufzeitfehler mit folgendem Inhalt:
Fehler
Der Standardwert für die Eigenschaft "MitPlaneten" kann nicht an einen bestimmten Thread gebunden werden.

Ich verstehe diese Fehlermeldung nicht.
Kann mir jemand dies erklären...
Besten Dank und Gruss

Thema: ToolTpService.SetIsEnable mit Code binden
Am im Forum: GUI: WPF und XAML

… ich kann es gleich selber beantworten. Man muss eben das DependencyProperty-Element verwenden...


                Binding toolTipBinding = new Binding("MitSternenToolTip");
                toolTipBinding.Mode = BindingMode.TwoWay;
                toolTipBinding.Source = this;
                toolTipBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
                obj.SetBinding(ToolTipService.IsEnabledProperty, toolTipBinding);

dann klappt es....

Thema: ToolTpService.SetIsEnable mit Code binden
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich versuche ein ToolTipService.IsEnable per Code zu binden.

In der Ansichtseite würde das so aussehen:


        <Button Grid.Row="0" Width="100" Height="30"
                ToolTipService.IsEnabled="{Binding Path=MitSternenToolTip, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                ToolTip="TestTip"
                Content="Click Me"/>
Das funktioniert auch wirklich!

Nun möchte ich dies im Code-Bereich ebenso codieren. Das habe ich dann so versucht:


Binding toolTipBinding = new Binding("MitSternenToolTip");
toolTipBinding.Mode = BindingMode.TwoWay;
toolTipBinding.Path = new PropertyPath("MitSternenToolTip");
toolTipBinding.Source = this;
toolTipBinding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
BindingOperations.SetBinding(obj, ToolTipService.SetIsEnabled, toolTipBinding);

Dies gibt aber eine Fehlermeldung, da logischerweise "ToolTipService.SetIsEnabled" kein DependencyPropery ist.
Weiss jemand, wie man einen solchen Service mit einem Property an ein Objekt binden kann??

Besten Dank!

Thema: Combobox in DataGrid zeigt keinen Wert zur Auswahl
Am im Forum: GUI: WPF und XAML

Es scheint tatsächlich ein Binding-Problem zu bestehen. Ich hatte meine UserControl als "Benutzersteuerelement" gebaut. Habe festgestellt, dass das Conrtol die gebundenen Daten nicht im Control sucht, sondern in der aufrufenden MainWindowViewModel-Klasse.
Habe nun das gleiche als "Benutzerdefiniertes UserControl" gebaut. Ist zwar etwas mühsamer zu bauen, aber dort habe ich das Binding im Griff und kann bestimmen, woher er die Daten nehmen soll. uns viola, es funktioniert...

Ich verstehe nun nur nicht ganz den Unterschied zwischen einem "Benutzersteuerelement" und einem "Benutzerdefiniertes UserContro". War dieser Fehler Zufall oder gibt es da tatsächlich wesentliche Unterschiede zwischen diesen beiden UserControl-Typen?

Thema: DataGrid mit dynamischen Columns
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich will in einem WPF-Benutzersteuerelement ein DataGrid dynamisch aufbauen. Das mache ich im Code.
Dazu will ich pro Zeile ein Button hinzufügen. Und in diesem Button soll eine Grafik sein.
Mit XAML würde so eine Button-Zeile so aussehen:


                    <DataGridTemplateColumn>
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <Button Command="{Binding DataContext.AttributBearbeitenCommand, RelativeSource={RelativeSource AncestorType={x:Type UserControl}, Mode=FindAncestor}}" 
                                        CommandParameter="{Binding ElementName=dgAttribute, Path=SelectedIndex}">
                                    <StackPanel>
                                        <Image Source="../Images/Bearbeiten48.png" Width="20" Height="20"/>
                                    </StackPanel>
                                </Button>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>


Einen Button in eine DatenGrid-Zeile einbinden, das habe ich bis jetzt so gemacht:


            DataGridTemplateColumn col5 = new DataGridTemplateColumn();
            DataTemplate template = new DataTemplate();
            FrameworkElementFactory buttonFactory = new FrameworkElementFactory(typeof(Button));
            buttonFactory.SetValue(Button.ContentProperty, "Bearbeiten");
            Binding bindBearbeiten = new Binding("BearbaeitenCommand") { Source = this };
            buttonFactory.SetBinding(Button.CommandProperty, bindBearbeiten);
            Binding bindRowNr = new Binding("SelectedIndex") { Source = this };
            buttonFactory.SetBinding(Button.CommandParameterProperty, bindRowNr);
            template.VisualTree = buttonFactory;
            col5.CellTemplate = template;
            this._DataGrid.Columns.Add(col5);


Dies scheint auch zu funktionieren. Was ich nun nicht hinkriege ist, den Text im Content durch eine Grafik zu ersetzen. Binde ich die Grafik in ein StackPanel ein und übergebe dies dem ContentProperty, so bekomme ich die Meldung:
Fehler
"System Windows.Controls.StackPanel" ist kein gültiger Wert für FrameWorkElementFactory:SetValue": von "Visual" oder "CntentElement" abgeleitete Werte werden nicht unterstützt.

Weiss jemand, wie ich in dieser Arte ein Grafik in den Button bringen kann?

Thema: Combobox in DataGrid zeigt keinen Wert zur Auswahl
Am im Forum: GUI: WPF und XAML

Ich benötige eure Hilfe. In einem UserControl ist ein DataGrid, welches das ItemsSource und das SelectecValue über je einen Property bezieht:


        public static readonly DependencyProperty RegelnProperty =
            DependencyProperty.Register("Regeln", typeof(Regeln), typeof(RegelDefinitionControl),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnRegelnPropertyChanged)));

        public Regeln Regeln
        {
            get { return (Regeln)GetValue(RegelnProperty); }
            set { SetValue(RegelnProperty, value); }
        }

        private static void OnRegelnPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RegelDefinitionControl control = (RegelDefinitionControl)d;
            if (control != null)
                control.OnRegelnChanged((Regeln)e.OldValue, (Regeln)e.NewValue);
        }

        private void OnRegelnChanged(Regeln oldValue, Regeln newValue)
        {
        }

        public static readonly DependencyProperty AttributListeProperty =
            DependencyProperty.Register("AttributListe", typeof(ObservableCollection<Attribut>), typeof(RegelDefinitionControl),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnAttributListePropertyChanged)));

        public ObservableCollection<Attribut> AttributListe
        {
            get { return (ObservableCollection<Attribut>)GetValue(AttributListeProperty); }
            set { SetValue(AttributListeProperty, value); }
        }

        private static void OnAttributListePropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            RegelDefinitionControl control = (RegelDefinitionControl)d;
            if (control != null)
                control.OnAttributListeChanged((ObservableCollection<Attribut>)e.OldValue, (ObservableCollection<Attribut>)e.NewValue);
        }

        private void OnAttributListeChanged(ObservableCollection<Attribut> oldValue, ObservableCollection<Attribut> newValue)
        {
        }


Dazu versuche ich im XAML die Definition für die Anzeige der Attributesliste aus Auswahl in einer DataGrid-Celle zu binden.


 <DataGrid Grid.Row="4" Grid.Column="1" Name="dgKondition" AutoGenerateColumns="False" 
                      CellStyle="{StaticResource Body_Content_DataGrid_Centering}"     
                      VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto"
                      ItemsSource="{Binding Path=Regeln.RegelSaetze, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      CanUserAddRows="True" CanUserDeleteRows="True" CanUserReorderColumns="False" CanUserResizeColumns="True"
                      CanUserSortColumns="False" CanUserResizeRows="False" Grid.ColumnSpan="2" Grid.RowSpan="2">
                <DataGrid.Columns>
                    ...
                    <DataGridComboBoxColumn Header="Attribut"
                                            ItemsSource="{Binding Path=AttributListe, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                                            DisplayMemberPath="Name"
                                            SelectedValueBinding="{Binding Path=AttributName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                            SelectedValuePath="Name"/>
                    ...
                </DatagridColumns>
</DataGrid>

Doch irgendwie will dies nicht so recht, zumindest zeigt das Combobox keinen Wert in der Auswahl.
Ausserhalb des DataGrides funktioniert das Combobox als eigenständiges Control durchaus richtig. Also meine ich, kann es nicht an der grundsätzlichen Konfiguration liegen. Da muss das DatatGrid irgend was Unterwartetes tun...

Danke gfür eure Hilfe!

Thema: Toggle-Button Backcolor für True und False ändern
Am im Forum: GUI: WPF und XAML

Das Control-Template des Toggle-Controls, wie von pinki beschrieben auslesen, dieses anpassen und lokal in die xaml-Definition einbinden...

Thema: Toggle-Button Backcolor für True und False ändern
Am im Forum: GUI: WPF und XAML

Danke pinki...
So geht es! Schon wieder was neues gelernt!!
Danke dir...

Thema: Toggle-Button Backcolor für True und False ändern
Am im Forum: GUI: WPF und XAML

Ich kann euch gerne zeigen wie ich den ToogleButton eingebaut habe:


    <Grid>
        <ToggleButton Width="50" Height="25" Name="button"
                      IsChecked="{Binding Path=Check, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ToggleButton.Style>
                <Style TargetType="ToggleButton">
                    <Setter Property="Background" Value="White"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=button, Path=IsChecked}" Value="True">
                            <Setter Property="Background" Value="Green"/>
                            <Setter Property="Content" Value="True"/>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding ElementName=button, Path=IsChecked}" Value="False">
                            <Setter Property="Background" Value="Red"/>
                            <Setter Property="Content" Value="False"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </ToggleButton.Style>
        </ToggleButton>
    </Grid>

Wie ihr seht, wird bei Status False der Button rot gezeichnet. Beim Status True aber leider nicht grün wie verlangt, sondern LightBlue.

Und nein, ich kann kein Template zeigen, weil ich keines gebaut habe. ich möchte lediglich die Farbe des Controls je nach Staus verändern.

Thema: Toggle-Button Backcolor für True und False ändern
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich möchte je nach Zustand des Toggle-Button die Backcolor ändern. Mit der Anpassung des Backcolors ändert sich lediglich die Farbe beim Zustand "False".
Bei Zustand des Controls für "True" wird permanent "LightBlue" angezeigt, egal, was ich bei Backcolor eintrage.
Offenbar wird im Control mit Definitionen in den Templates eine Steuerung des Farbverhaltens gemacht.
Wo finde ich eine entsprechende Dokumentation?
Wie muss ich grundsätzlich vorgehen, um die Farbe des Steuerelementes ToggleButton beim Status IsChecked = True zu ändern?

Thema: Trigger auf eine Zelle eines Datenvektors
Am im Forum: GUI: WPF und XAML

Habe eine elegantere Lösung als diesen Trigger gefunden und der funktioniert sogar. Anstelle des Triggers binde ich den BackColor auf den Inhalt der TextBox.


            for (int i = 0; i < this.YLayerAnzahl; i++)
            {
                TextBox tb = new TextBox();
                tb.Name = "YLayer" + i;
                tb.Margin = new Thickness(2.0);

                Binding bindYB = new Binding("Text") { Source = tb, Mode = BindingMode.OneWay };
                bindYB.Converter = new AssociativMemorySample.StringToBrushConverter();
                tb.SetBinding(ToggleButton.BackgroundProperty, bindYB);

                Grid.SetRow(tb, 0);
                Grid.SetColumn(tb, 3 + i);
                Binding bind = new Binding("YLayer[" + i + "]") { Source = this, Mode = BindingMode.TwoWay };
                bind.Converter = new AssociativMemorySample.IntToStringVorConverter();
                tb.SetBinding(TextBox.TextProperty, bind);
                this.gridBoard.Children.Add(tb);
            }

Danke und Gruss!

Thema: Trigger auf eine Zelle eines Datenvektors
Am im Forum: GUI: WPF und XAML

Genau, dieser Converter schreibt die Zahl der Zelle in einen darstellbaren Wert um. Diese Bindung funktioniert richtig.


        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if (value == null)
                return "";
            int zahl = (int)value;
            string wert= String.Format("{0:+0;-0;0}", zahl);
            if (zahl == 0)
                wert = "";
            return wert;
        }

Das Ergebnis siehst du im Anhang. Das Programm ist ein Modell für einen Assoziativ-Speicher....

Thema: Trigger auf eine Zelle eines Datenvektors
Am im Forum: GUI: WPF und XAML

Hoi zäme
In einem UserControl bekomme ich über einem DependencyProperty einen Vektor int[] zugeordnet.


        public static readonly DependencyProperty XLayerProperty =
            DependencyProperty.Register("XLayer", typeof(int?[]), typeof(DynamischMemoryBoard),
                new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault,
                    new PropertyChangedCallback(OnXLayerPropertyChanged)));

        public int?[] XLayer
        {
            get { return (int?[])GetValue(XLayerProperty); }
            set { SetValue(XLayerProperty, value); }
        }
         .......
         .......

Da dieser Vektor einen variable Länge hat, erstelle ich das GUI ebenfalls dynamisch. Dabei wird jede Zelle des Vektors einzeln in einem TextBox dargestellt. Dabei sollen die Felder farblich unterschiedlich dargestellt werden, falls sie kleiner oder grösser o sind.
Dazu baue ich die einzelnen TextBox in einer Schlaufe aufgebaut:


            for (int i = 0; i < this.YLayerAnzahl; i++)
            {
                TextBox tb = new TextBox();
                tb.Name = "YLayer" + i;
                tb.Margin = new Thickness(2.0);

                DataTrigger triggerYPlus = new DataTrigger();
                triggerYPlus.Binding = new Binding("YLayer[" + i + "]") { Source = this, Converter = new AssociativMemorySample.GreaterThenNullConverter() };
                triggerYPlus.Value = true;
                triggerYPlus.Setters.Add(new Setter(TextBox.BackgroundProperty, Brushes.LightGreen));
                Style styleY = new Style();
                styleY.Triggers.Add(triggerYPlus);
                DataTrigger triggerYMinus = new DataTrigger();
                triggerYMinus.Binding = new Binding("YLayer[" + i + "]") { Source = this, Converter = new AssociativMemorySample.LessThenNullConverter() };
                triggerYMinus.Value = true;
                triggerYMinus.Setters.Add(new Setter(TextBox.BackgroundProperty, Brushes.LightPink));
                styleY.Triggers.Add(triggerYMinus);
                tb.Style = styleY;

                Grid.SetRow(tb, 0);
                Grid.SetColumn(tb, 3 + i);
                Binding bind = new Binding("YLayer[" + i + "]") { Source = this, Mode = BindingMode.TwoWay };
                bind.Converter = new AssociativMemorySample.IntToStringVorConverter();
                tb.SetBinding(TextBox.TextProperty, bind);
                this.gridBoard.Children.Add(tb);
            }

Wird der Vektor dem UserControl übergeben funktioniert der Trigger, die Farbe des TextBox-Elementes wird geändert. Wird nun aber ein Wert in einer der TextBoxen verändert, so bekommt der Trigger keinen Anstoss, weil das DependencyProperty offenbar die Veränderung nicht erkennt.

Weiss jemand, wie ich mich behelfen kann? Wie kann ich erzwingen, dass bei einer Veränderung der Variable an der Stelle i (Layer=1) den Trigger auslöst?

Thema: PropertyChanged aus abgeleiteter Klasse verwenden
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich habe in einer Klasse als Basisklasse eine "ObservableCollection" eingebunden. In der Klasse gibt es sonst noch ein Attribut "PositionName". Sie Programm-Code unten.


    public class RadarPositionen : ObservableCollection<DistanzPosition>, INotifyPropertyChanged
    {
        private string _PositionName;

        public RadarPositionen()
            : base()
        { }

        public string PositionName
        {
            get { return this._PositionName; }
            set
            {
                this._PositionName = value;
                this.RaisePropertyChanged("PositionName");
            }
        }

        protected void RaisePropertyChanged(string propertyName)
        {
            PropertyChangedEventHandler handler = base.PropertyChanged;
            if (handler != null)
                handler(this, new PropertyChangedEventArgs(propertyName));
        }

Den event "PropertyChanged" kann ich in der Klasse nicht mehr festlegen, weil dieser schon in der Basisklasse besteht. Trotzdem möchte ich die Veränderung des zusätzlichen Attributs (PositionName) mit PropertyChanged an den XAML-Code weiterleiten.
Wie kann ich aber auf den PropertyChangedEventHandler der Basisklasse zugreifen, damit ich in der Klasse diesen Event auslösen kann?
Meine übliche Anwendung mit der Funktion "RaisePropertyChanged" (siehe im Code oben funktioniert nicht. Dies ergibt die Fehlermeldung "Das ObservableCollection<DistanzPosition>.PropertyChanged-Ereignis kann nur links von += oder -= verwendet werden.".

Kann mir jemand helfen??

Thema: MouseWheel in ListView funktioniert nur, wenn Maus auf der Scrollbar ist
Am im Forum: GUI: WPF und XAML

Also den inneren ScrollViewer verwenden, dann funktioniert es bei einer ListView, das MousWheel funktioniert!!

Thema: MouseWheel in ListView funktioniert nur, wenn Maus auf der Scrollbar ist
Am im Forum: GUI: WPF und XAML

Salü zäme
Ich habe eine ListView in einem ScrollView eingebettet.
Was mir auffällt ist, dass das MouseWheel verhalten im ListView-Bereich nicht funktioniert. Lediglich wenn der Cursor auf der ScrollBar-Leiste steht, kann mit der MouseWheel gescrollt werden.


                            <ScrollViewer Grid.Column="1" HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto"
                                          CanContentScroll="True" Background="Transparent">
                                <ListView ItemsSource="{Binding Path=TelegrammListe, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                                          BorderBrush="Black" BorderThickness="0.5"
                                          MinWidth="350">
                                    <ListView.View>
                                        <GridView>
                                            <GridView.Columns>
                                                <GridViewColumn Header="Telegramm" DisplayMemberBinding="{Binding Path=ZeileLesbar}"
                                                                Width="330"/>
                                            </GridView.Columns>
                                        </GridView>
                                    </ListView.View>
                                </ListView>
                            </ScrollViewer>

Weiss jemand, was ich machen muss, damit das MouseWheel-Ereignis auch auf der Fläche des ListViews Wirkung zeigt.

(Erstaunlich ist, verwende ich in ItemsControl an Stelle des ListViews, so funktioniert das MouseWheel-Ereignis auch auf der Fläche der Daten.)