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 trashkid2000
Thema: WPF - Ribbon mit MVVM-Pattern nutzen
Am im Forum: .NET-Komponenten und C#-Snippets

Hi,

ich dachte mir mal, ich poste mal ein Tutorial.
Und das für die Verwendung des WPF - Ribbon unter der Verwendung des MVVM-Pattern.

Vorwort: Es gibt von M$ ein paar Samples zu diesem Thema, eine Suche nach 'MicrosoftRibbonForWPFSourceAndSamples' findet diese.

Soweit so gut, aber dies ist nicht das, nach dem ich suchte...
In den Samples werden (umfangreiche) Objekte im ViewModel zusammengebaut. Aber MVVM-konform ist das nicht. Es ist so einfach nicht möglich, das ganze Konstrukt einfach umzubiegen...

Beruflich habe ich eine Umsetzung benötigt, in der wie gewöhnt, einfach ein ViewModel und das entsprechende DataTemplate definiert werden kann.

Also, nach ein paar fails hier eine Lösung des Ganzen.
Überschrieben wurde dabei die Definition, wie Das jeweilige ItemsControl seine Items erzeugt.

Bei dem Ribbon ist es das ControlTemplate, was bei der Erzeugung der Tabs überschrieben wurde.
Bei dem ApplicationMenu einfach der Container, der zur Anzeige eines Items erzeugt wird.


public class CustomRibbon : Ribbon
{
   /// <summary>
   /// Bereitet den RibbonTab so vor, dass der Content auf das Item gesetzt wird und ein definiertes DataTemplate zur Anzeige genutzt wird
    /// </summary>
    /// <param name="element">Der Tab, der zur Anzeige vorbereitet werden soll</param>
    /// <param name="item">Objekt, das als Content gesetzt wird</param>
    protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
    {
        var tab = (RibbonTab)element;

        var controlTemplate = new ControlTemplate(typeof(RibbonTab));
        var contentControlFactory = new FrameworkElementFactory(typeof(ContentControl));
        contentControlFactory.SetBinding(ContentControl.ContentProperty, new Binding() { Source = item });

        contentControlFactory.SetBinding(VisibilityProperty, new Binding() 
        { 
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged, Source = tab, 
            Path = new PropertyPath(nameof(tab.IsSelected)), Converter = new BooleanToValueConverter() { FalseValue = Visibility.Collapsed, TrueValue = Visibility.Visible } 
        });
        
        controlTemplate.VisualTree = contentControlFactory;
        contentControlFactory.SetValue(IsTabStopProperty, false);
        tab.Template = controlTemplate;

        tab.Header = item;
   }
}


public class CustomRibbonApplicationMenu : RibbonApplicationMenu
{
   /// <summary>
   /// Erstellt einen neuen Container für einen Eintrag im Menü
   /// </summary>
    /// <returns>Den erstellten Container</returns>
   protected override DependencyObject GetContainerForItemOverride()
   {
      return new ContentControl() { IsTabStop = false };
   }

   /// <summary>
   /// Bereitet den Menüeintrag für die Anzeige vor
   /// </summary>
   /// <param name="element">Das <see cref="ContentControl"/>, das als Container genutzt wird</param>
   /// <param name="item">Der Content</param>
   protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
   {
       var contentControl = ((ContentControl)element);
       contentControl.Content = item;
    }

   /// <summary>
   /// Behebt das Verhalten, dass das Menü geschlossen wird, wenn ein Menuitem, das disabled ist, angeklickt wird.
   /// </summary>
   /// <param name="e">Die <see cref="MouseButtonEventArgs"/></param>
   protected override void OnPreviewMouseLeftButtonUp(MouseButtonEventArgs e)
   {
      if (e.OriginalSource is ContentPresenter applicationMenuItemContentPresenter)
      {
         if (VisualTreeHelper.GetChild(applicationMenuItemContentPresenter, 0) is RibbonApplicationMenuItem applicationMenuItem)
         {
            if (!applicationMenuItem.IsEnabled)
            {
                e.Handled = true;
             }
          }
       }

       base.OnPreviewMouseLeftButtonUp(e);
   }

   /// <summary>
   /// Behebt das Verhalten, dass in dem Menü manchmal direkt das ContentControl des ContainerForItemOverride angesprungen wurden und das AppMenuItem dann nicht fokussiert wurde. Gerade bei Up und Down war das aufgefallen.
    /// </summary>
    /// <param name="e">Die <see cref="KeyboardFocusChangedEventArgs"/></param>
    protected override void OnGotKeyboardFocus(KeyboardFocusChangedEventArgs e)
    {
        if (e.OriginalSource is ContentControl contentControl)
        {
            var applicationMenuItem = (UIElement)contentControl.FindVisualChildren<DependencyObject>().FirstOrDefault(x => x.GetType().GetProperty(nameof(QuickAccessToolBarId)) != null);
            if (applicationMenuItem != null)
            {
                applicationMenuItem.Focus();
             }
         }

         base.OnGotKeyboardFocus(e);
     }
}

Eingebunden wird dies dann wie folgt:

<Controls:CustomRibbon ItemsSource="{Binding RibbonTabItems}">
   <Controls:CustomRibbon.ApplicationMenu>
      <Controls:CustomRibbonApplicationMenu ItemsSource="{Binding ApplicationMenuItems}" FooterPaneContent="{Binding CloseApplicationFooterPaneContent}" AuxiliaryPaneContent="{Binding AuxiliaryPaneContent}"/>
   </Controls:CustomRibbon.ApplicationMenu>
</Controls:CustomRibbon>

Ein Sample-Projekt kann unter
https://drive.google.com/file/d/1d2OckuDTLwnZ86p50Keyh_67zz2eWwFC/view?usp=sharing
heruntergeladen werden.

Viel Spaß damit,
Marko

Thema: Style überschreibt eigene Control-Klasse?
Am im Forum: GUI: WPF und XAML

Hi,

es reicht nicht, einfach nur von RadioButton zu erben und in der vererbten Klasse Methoden zu überschreiben. Denn so änderst Du nur das Verhalten.

Was Du machen möchtest, ist, dass Du das Aussehen verändern willst (ja, und das Verhalten).

Da kommst Du nicht drum rum, das ControlTemplate zu überschreiben.
Eine gute Übersicht findest Du hier: RadioButton Styles und Templates

lG, Marko

Thema: Visual Studio 2017 vs 2019: The breakpoint will not currently be hit. The source code is different
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Hi,

ich hatte zwischenzeitlich auch mal VS 2019 ausprobiert...
Nach ein wenig Arbeit habe ich mir nun wieder VS 2017 installiert. Dank Side by Side ja zum Glück möglich :-)

Ich hatte die genannten Probleme auch.
Das war bei einer WPF-Bibliothek, bei der ich eine neues Control eingefügt habe.
Und dieses bei dem referenzierten Projekt einfach nicht erkannt wurde...

Nach gefühlten 10x Clean, Rebuild, schließen und öffnen von VS und erneutem Laden der Solution ging es dann irgendwann.
Ich konnte damals das Problem nicht wirklich eingrenzen.

Nachdem mir dann irgendwann die gesamte Solution mit Fehlern, die nicht ersichtlich waren, um die Ohren flog, habe ich den Entschluss gefasst, zurück zu rudern.

Thema: .NET Standard Output wird mit .NET Framework ausgelesen und bringt anderes Ergebnis
Am im Forum: Rund um die Programmierung

Hi Abt :-)

Zitat von Abt
Du kannst die Bibliothek höchstens irgendwo referenzieren und dann in .NET Core, .NET Framework... ausführen.
Daher in der Form der Erklärung eigentlich nur zwei potentielle Ursachen:
- Unterschiedene der referenzierten Pakete
Ja, die NETStandard-Bibliothek wird in ein .NET Framework-Projekt refrenziert.

Und genau, der Unterschied liegt in dem von dem Package referenzierten Pakete:

Unter .NET Framework 4.6 sind es diese:
System.Security.Cryptography.Encoding (≥ 4.3.0)
System.Security.Cryptography.X509Certificates (≥ 4.3.0)

Unter .NETStandard 2.0 diese:
System.Buffers (≥ 4.4.0)
System.Security.Cryptography.Cng (≥ 4.4.0)
System.Memory (≥ 4.5.1)

Ab .NET Framework 4.6.1 gibt es keine Abhängigkeiten mehr...

Ich habe es zum Laufen gebracht, indem nun die Assembly, die für NETStandard 2.0 gedacht ist, sowie alle da abhängigen Assemblies, geladen werden.

Aber so ganz verstehen tue ich es trotzdem nicht
lG, Marko

//EDIT: Ich werde mal ein konkretes Beispiel nachstellen

Thema: .NET Standard Output wird mit .NET Framework ausgelesen und bringt anderes Ergebnis
Am im Forum: Rund um die Programmierung

Hi Abt,

Zitat von Abt
.NET Standard ist nur ein Vertrag - keine Runtime.
.NET Standard ist aus C# sicht als Interface zu sehen, während .NET Framework, Mono, Xamarin, .NET Core.. als konkrete Implementierung zu sehen sind.
Soweit dachte ich auch. Wie gesagt, die API auf dem Server ist gege .NET CORE 2.x entwickelt.
Zitat von Abt
Die Frage ist hier also eher, ob sich jede Runtime identisch verhält.
Zitat von Abt
Konkretes Beispiel?
[Tutorial] Vertrackte Fehler durch Vergleich von echtem Projekt mit minimalem Testprojekt finden
Das habe ich mir gestern gebaut, in dem ich eine dumme Consolen-App geschrieben habe, die unter .NET Framework 4.6 läuft, und einmal ein Binary vom Server mit Framework-Bordmitteln entschlüsselt. Da kommt das Besagte bei raus.
Zusätzlich inkludiert das Testprojekt noch eine netStandard-Bibliothek in 2.0, wo genau das Gleiche getan wird.
Und da passt es dann
Wenn ich heute mal dazu komme, werde ich es hier mal posten.
Danke erstmal, Marko

Thema: .NET Standard Output wird mit .NET Framework ausgelesen und bringt anderes Ergebnis
Am im Forum: Rund um die Programmierung

Hi,

ich kämpfe nun schon eine ganze Weile, und es bringt mich bald um den Verstand....
Wir haben eine API, die unter .NET Core 2.1 läuft, und unter anderem Daten verschlüsselt....
Das macht die Bibliothek 'System.Security.Cryptography.Pkcs'. Diese erstellt eine verschlüsselte Nachricht für ein oder mehrere Empfänger. Per nuget eingebunden.
Soweit alles gut, läuft

Auf Clientside empfangen wir die Nachrichten und müssen sie auch wieder entschlüsseln.
Und genau hier gehen die Probleme los...

Der Client ist gegen .NET Framework 4.7 programmiert. Die oben genannte Bibliothek ist in der gleichen Version per nuget eingebunden, aber es verhält sich anders...
So können die verschlüsselten Werte auch wieder entschlüsselt werden, aber der Wert, der da raus fällt, passt nur so halb.

Es sind immer irgendwelche Sonderzeichen am Anfang drin...
Das scheint irgendwie ein Codierungs-Problem zu sein. Aber wir benutzen überall UTF8.
Gegen netStandard 2.0 können die Werte ganz normal entschlüsselt werden.

Ich sehe auch, dass das Package je nach Framework unterschiedliche Assemblies einbindet, vielleicht liegt darin das Problem??

Ist da was bekannt?
Für Antworten bin ich sehr dankbar,
lG Marko

Thema: RedirectStandardOutput DosShell unter W7 und neuer
Am im Forum: Grundlagen von C#

Ich sehe da eindeutig zu viele

KillTasks();

Thema: RedirectStandardOutput DosShell unter W7 und neuer
Am im Forum: Grundlagen von C#

Hallo,

also sowas ist böse:

comboBox_SampleFreq.SelectedIndex=i;

Was der User ausgewählt hat, solltest Du so belassen. Das gibt sonst nur Probleme.
Und wozu das?

Viel schlimmer ist aber noch das:


if (Gen.StandardError.Peek()>0)
{
   comboBox_SampleFreq.Items.RemoveAt(i--);
}
Was kann die "arme ComboBox" dafür, dass Fehler auftreten? Die Items sollten hier ziemlich konstant sein!

Thema: rand.Next mit negativem Value bricht das Programm ab
Am im Forum: Grundlagen von C#

Hi, das Argument bei der Methode


rand.Next(...);
verlangt einfach mal einen maxValue. Und der darf nicht kleiner als 0 sein.
Du kannst aber den Wert auch einfach umformen und dann * -1 rechnen

lG, Marko

Thema: WebAssembly Desktop Standardisierung
Am im Forum: Szenenews

Hi Abt,

vielen Dank erstmal für Deinen Beitrag

Zitat von Abt
Das Problem von JavaScript ist aber, dass es teilweise einfach eine Hassliebe ist; und, dass JavaScript eben im Plaintext auf dem Client verarbeitet wird.

Genau so ist es... die Liebe dazu und der Hass dagegen, das sind wirklich Welten...
Zitat von Abt
Damit wäre ein weiterer Schritt gegeben, dass heutige Web-Technologien mehr und mehr auf dem Desktop ankommen.

Ein sehr guter Weg in die richtige Richtung.
Aber ich sehe es nicht kommen, das man mit einer SPA alles machen kann, was man halt mit einer Desktop-App machen kann.

Denn irgendwie bist Du ja immer im Browser gefangen... das hoffe ich doch zumindest !!

Marko

Thema: [gelöst] gRPC als Service
Am im Forum: Netzwerktechnologien

Hi,

okay, vielen Dank für die Antwort erstmal :-)
Für alle, die das gleiche Problem haben, wirklich sehr hilfreich

Aber was die Bibliothek anders macht, das kannst Du nicht evaluieren?

Thema: [gelöst] gRPC als Service
Am im Forum: Netzwerktechnologien

Um den Fehler eingrenzen zu können, müsste man sich wohl mal das ganze Netzwerkprotokoll ansehen... also wirklich, was sendet der Client, und was bekommt er dann vom Server.

Sonst ist das alles nur ganz viel rätselraten...

Thema: DCom findet keine Protokolle um mit Computer zu kommunizieren
Am im Forum: Entwicklungs- und Laufzeitumgebung (Infrastruktur)

Interessant wäre ja hier, was Du versucht hast...
Was ist denn "Alles"?

Thema: Label in mehrsprachigen WinForm über Sourcecode füllen
Am im Forum: GUI: Windows-Forms

Hi,

das ist schön :-)
Und für alle, die das gleiche Problem bzw. die gleiche Frage haben, wäre es sehr klasse, wenn Du Deine Lösung posten könntest

Marko

Thema: Mit einem Foreach in einem Datagridview über alle Rows iterieren
Am im Forum: GUI: Windows-Forms

Hi,

Zitat von romu2000
Wie könnte ich das ganze automatisiert alle 10 Sekunden pro Row ausführen lassen?
Also automatisiert alle 10 Sekunden, bei einem WebRequest finde ich sehr sportlich.
Mit Threading bestimmt machbar, aber ja:
Zitat von HexEdit
Was soll das Programm denn machen?

//// edit: Du verwendest doch nie das Result, was Du durch den WebRequest absendest...

Thema: Wie kann ich eine Textdateien nach Doppelklick mit meinem eigenen Editor öffnen?
Am im Forum: Grundlagen von C#

Zitat von marlem
Also:
ich entwickle einen barrierefreien Texteditor mit Microsoft Dotnet WPF.
der kommt auf meine Webseite zum kostenlosen Download.

Auch wirklich nicht böse gemeint, aber ich persönlich bleibe ganz sicher, wenn ich das hier so lese, bei meinem Notepad++ oder Visual Studio Code.

Alle können unheimlich viel, inklusive zig PlugIns.

Und ehrlich gesagt wäre es für mich ein Totschlagkriterium, wenn sich eine Software (und am besten noch ohne Nachfrage) als Standardprogramm registrieren würde !!

Was bedeutet denn barrierefrei eigentlich im Kontext eines Editors?

Marko

Thema: VirtualStore beim Umstieg von 32 auf 64 Bit nicht mehr verfügbar?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Zitat von LaTino
Es gibt keine Begründung, wieso ein Programm, das unter eingeschränkten Berechtigungen laufen können muss, Schreibrechte auf sein Installationsverzeichnis haben sollte.
Ich habe ja auch nicht gesagt, dass dort ein schreibender Zugriff möglich sein soll Ja, bitte, never!!
Aber die Anwendung, die aus dem Pfad gestartet wird, sollte sehr wohl seine Application Settings laden dürfen.
Wer und wie diese geändert werden können, steht auf einem anderen Blatt.

User Settings landen natürlich im Benutzerprofil.
Zitat von LaTino
Es ist gefährlicher Unsinn, ApplicationSettings im Installationspfad zu hinterlegen.
LaTino
warum?

Thema: VirtualStore beim Umstieg von 32 auf 64 Bit nicht mehr verfügbar?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Hi,

von welcher Art von Konfiguration reden wir hier?
Die typische app.config?
In denen nur Application-Settings stehen?

Zitat von Abt
Wer unter Windows XP oder Vista Konfigurationsdateien in das Anwendungsverzeichnis und damit in einen für den User geschützten Ordner abgelegt hat, hat es damals schon falsch gemacht.

Ach ja?
Ich bin sehr wohl der Meinung, dass eine app.config mit ApplicationSettings dort gespeichert sein sollte, wo das Programm liegt.. also meist unter C:\Programme, oder C:\Programme(x86),
(und auch nicht jeder DAU-User schreiben und etwas ändern kann)

Wo hat VS seine devenv.exe.config abgelegt??

Ein anderer Part sind User-Settings
Die gehören ganz sicher an einen Plaz, wo der User auch Schreibberechtigung hat

Thema: Klasse mit gekapselten Variablen in XML serialisieren - Programmierstil
Am im Forum: Grundlagen von C#

Zitat von T-Virus
Hier wieder das Rad neu zu erfinden um es wieder einmal runder zu machen zeugt meistens von mangelhafter Erfahrung was generelle und grundsätzliche Lösungswege angeht
natürlich

Und nein, nach mehr als 10 Jahren damit vertraut keine mangelnde Erfahrung...
Vielleicht nur manchmal einfach (zu sehr) auf Sicherheit bedacht

Thema: Klasse mit gekapselten Variablen in XML serialisieren - Programmierstil
Am im Forum: Grundlagen von C#

Sorry,
@Abt

Zitat von Abt
Das Grundproblem ist, dass hier offensichtlich der Beschreibung nach keine Schichtentrennung erfolgt.
Es werden also Klassen zum Speichern verwendet, die UI- oder Businessmodelle darstellen.
Bzw. Businesslogik enthalten. Ja, da gebe ich Dir Recht. Das ist nicht gut.
Die DataModel-Schicht (Infrastructure, oder wie auch immer) soll also nur dumm sein. Und Daten halten.
Und im besten Fall die Daten nicht einfach von "außen" modifizierbar machen.
Zitat von Abt
Ein Feld ist nur ein "dummes" Klassenmember; also eine Variable.
Eigenschaften sind jedoch Abstraktionen; Du kannst beim Setzen (oder Lesen) noch zusätzliche Dinge tun (zB Lazy Loading, Events feuern..) - was bei einem Feld nicht geht.
Das beißt sich meiner Meinung nach mit Schichtentrennung und dumme Datenklasse

Thema: Klasse mit gekapselten Variablen in XML serialisieren - Programmierstil
Am im Forum: Grundlagen von C#

Wenn Du Json.NET benutzt,
gibt es da noch die Möglichkeit von private Setters:


[JsonProperty]
public Guid? ClientId { get; private set; }

Nur mal so als Anregung

// Edit: jaa...
XML und kein JSON... passt dann gar nicht

Thema: Klasse mit gekapselten Variablen in XML serialisieren - Programmierstil
Am im Forum: Grundlagen von C#

Zitat von T-Virus
@trashkid2000
Sowas macht man nicht.
Dafür gibt es, wie Th69 schon sagt, einfach Eigenschaften.

Die dann aber auch public get set sein müssen...
Deswegen lasse ich es nicht so einfach stehen.
Und ja, manchmal ist für Sicherheit auch (viel) Mehraufwand nötig.

Thema: Wie kann ich ein Typargument expliziert angeben?
Am im Forum: Grundlagen von C#

Hi,

wo kommt denn die Methode

Generate(..., ...)
her?

Da fehlt doch sicher ein Namespace - Import?

Gruß, Marko

Thema: Klasse mit gekapselten Variablen in XML serialisieren - Programmierstil
Am im Forum: Grundlagen von C#

Hi,

Du könntest einen Custom-Serializer/ Deserializer erstellen, der dann aus privaten Feldern die Daten in die XML schreibt bzw. aus dieser in die privaten Felder schreibt.

Gruß, Marko

Thema: Breitenbestimmung im Usercontrol manipulieren
Am im Forum: GUI: WPF und XAML

Hi,

kannst Du mal ein kleines Beispielprojekt mit diesem Control online stellen?
Dann kann ich mal schauen...

lG, Marko

// edit: hat sich wohl erübrigt

Thema: WebAPI-Result komprimieren
Am im Forum: Web-Technologien

Schaue Dir z.B. mal OData an...

Thema: WebAPI-Result komprimieren
Am im Forum: Web-Technologien

Hi,

Zitat von scoKi!
Die Anwendung erhält >100000-Datensätze durch diesen einen Funktionsaufruf. Jeder Entry hat hierbei ca. 200 Properties

sorry, wenn ich es so schreibe, aber bitte welche Anwendung soll speichertechnisch damit umgehen (können)? Das ist schon eine Menge !
Zitat von scoKi!
Jetzt mal Flach dargestellt. Diese Informationen liegen verschachtelt vor


Was höchstwahrscheinlich noch viele JOINS auf Serverseite zur Folge hat...
Und Warten des Clients...

Du musst wirklich die Datenmengen begrenzen, die von dem Server abgerufen werden und durch den Client materielisiert werden !

Thema: Breitenbestimmung im Usercontrol manipulieren
Am im Forum: GUI: WPF und XAML

Hi,

also mein erster Gedanke bei Deinen Fragen unten war, dass Du mit einem ValueConverter arbeiten könntest. Das wäre dann eine Konvertierung von Width des StackPanels, in dem die Vorschläge angezeigt werden zu max 2* Width für die TextBox.

Und ansonsten würde ich bei der TextBox dann einfach das TextWrapping einschalten.
Dann sollte es passen. Nur weiß ich nicht, wegen Popup und Visual Tree, ob Du da an die Controls ohne weiteres rankommst...

Grüße, Marko

Thema: Vereinzelte Probleme beim E-Mail-Versand
Am im Forum: Ankündigungen

SPF habe ich vorher auch noch nie gehört... klingt aber irgendwie vielversprechend !

Sicherheit ist, wenn nichts mehr geht... ! Und das habe ich die letzten Tage vor dem Weihnachtsurlaub auf Arbeit so oft gehabt.

Thema: Fanuc-Steuerung Daten auslesen
Am im Forum: Rund um die Programmierung

Zitat von Christoph1972
Zitat von Abt
Puh, wirklich? Auf diesem Niveau jetzt...?

Irgendwie bist du immer von oben herab unterwegs, eigentlich sehr schade für diese Forum!

Gerade fundierte Meinungen sind für dieses Forum (und im Allgemeinen) sehr wichtig !
Und ob von oben herab oder auf gleicher Augenhöhe liegt immer im Auge des Betrachters