Laden...

Forenbeiträge von Lando Ingesamt 74 Beiträge

22.03.2020 - 13:37 Uhr

Die Derivate-Partial Funktion aus der Bibliothek erwartet als Funktion eine F# Funktion weshalb ich die Eingangs erwähnte Funktion als F-Sharp umsetzten und dort aufrufen muss

Keine Ahnung wie Du darauf kommst. Die Bibliotheken TAlex.MathCore.* scheinen mir nichts mit F# zu tun zu haben.

Ansonsten kann F# und C# Code sich sehr gut gegenseitig ergänzen. F# Module werden zu statischen Klassen und Funktionen zu statischen Methoden kompiliert.

nur weiß ich nicht wie man die 2 Projekte verbindet

Manage references in a project

20.03.2019 - 07:20 Uhr

Guten Morgen,

Das Tooling generiert für XAML-Dateien C#-Code, wo u. a. die InitializeComponent-Methode enthalten ist. Das passiert in zusätzlichen MSBuild-Targets, die für die jeweiligen Projekttypen definiert sind. Wenn Du nur den Compile-Target laufen lässt, werden diese Targets nicht ausgeführt und die generierten Dateien werden nicht zur Liste von zu kompilierenden Dateien hinzugefügt (und vermutlich auch nicht generiert). Führe den Build-Target aus, dann wird auch alles korrekt generiert und dem Compiler übergeben. Du kannst diese Targets auch selbst ausführen, aber dazu müsstest Du wissen, wie sie heißen und in welcher Reihenfolge sie ausgeführt werden müssen.

Grüße

18.07.2017 - 16:16 Uhr

Dann bräuchte ich nicht einmal einen Mac?

Doch, Du brauchst einen Mac mit XCode, zum Kompilieren Deiner App.

07.02.2017 - 07:48 Uhr

WPF macht es nichts aus, wenn PropertyChanged auf einem Hintergrundthread ausgelöst wird. Gebundene Controls werden automatisch auf dem UI-Thread geupdated. Ich finde jetzt leider keine offizielle Dokumentation darüber, aber ich kann bestätigen, dass es funktioniert. Siehe auch diesen StackOverflow Thread.

Man muss aber mit der ObservableCollection<T>-Klasse aufpassen, da muss man auf den UI-Thread, bevor man irgendwas damit macht.

01.02.2017 - 07:35 Uhr

Ich kann auch nichts auf Google finden, Beispielsweise Tutorials, wie man Programme designed.

Das glaube ich nicht.

WPF-Layout-Container
WPF Layouts - A Visual Quick Start
WPF - Layouts

03.12.2016 - 12:34 Uhr

"Binding" kann nicht für die Eigenschaft "Source" vom Typ "ResourceDictionary" festgelegt werden. "Binding" kann nur für eine "DependencyProperty" eines "DependencyObject" festgelegt werden.

Die Meldung ist doch eindeutig. Die Source-Property ist keine DependencyProperty, deswegen kann sie nicht gebunden werden. Die ResourceDictionary-Klasse ist noch nicht einmal ein DependencyObject.

Um ein ResourceDictionary zur Laufzeit auszutauschen musst du also ins Code Behind, einfach den Namen zu binden und durch einen Converter zu schicken geht in dem Fall nicht. Ich bin mir noch nicht einmal sicher, ob der DataContext in den Ressourcen eines Objekts überhaupt zur Verfügung steht.

Grüße

26.10.2016 - 18:19 Uhr

JSON ist kein gutes Format für Konfigurationen. Einfach aus dem Grunde, dass es keine Kommentare kennt. Wenn diese Konfigurationsdateien von Menschen bearbeitet werden sollen, ist das ein großer Nachteil für mich.

Wenn ich die Wahl zwischen INI und JSON hätte, würde ich lieber INI nehmen.

Grüße

26.09.2016 - 10:14 Uhr

Mal nebenbei: Ein byte[][] ist kein 2D-Array, sondern ein Jagged Array. Ein 2D-Array wäre byte[,]. Das sind zwei unterschiedliche Paar Stiefel.

20.09.2016 - 08:20 Uhr

Ich kann nichts zum eigentlichen Problem beitragen, aber:

Und HttpWebRequest hat dieses Property bei mir garnicht erst obwohl es laut MSDN da sein sollte.

Manchmal sind bestimmte Member mit einem Attribut / EditorBrowsableAttribute versehen, damit sie nicht im Editor auftauchen. Für mich ein sehr nerviges und sinnloses "Feature".

Grüße

03.08.2016 - 14:02 Uhr

Ich finde es auch nicht schlimm, direkt mit dem ServiceLocator zu arbeiten. Service Locator is an Anti-Pattern

31.03.2016 - 21:14 Uhr

Schade, dass man im Debug Modus nicht generell alles auf x86 CPU laufen lassen kann und dann beim Release erstellen automatisch auf Any CPU.

Doch, das kannst du. Hab jetzt kein VS zur Hand, aber spätestens wenn du die Projektdatei manuell bearbeitest, kannst du das erreichen. Sind ja standardmäßig zwei komplett voneinander unabhängige Konfigurationen.

28.03.2016 - 12:22 Uhr

Hast du auch das Fenster "Testexplorer" geöffnet? So wie hier gezeigt?

27.03.2016 - 22:16 Uhr

Sowohl NUnit als auch xUnit.net haben jeweils einen VS Runner, den man über NuGet installieren kann. Hier ist das Package für NUnit. So braucht nicht jeder Entwickler das Plugin installieren und das Projekt ist etwas mehr self-contained.

16.03.2016 - 07:25 Uhr

Guten Morgen,

du könntest es auch so machen wie hier: http://www.codeproject.com/Articles/34405/WPF-Data-Virtualization

Da wird eine eigene Collection-Klasse erstellt, die ihre Items seitenweise hält und bei Bedarf Seiten nachlädt. Nicht benötigte Seiten werden dereferenziert und dem GC überlassen.

Grüße

05.02.2016 - 14:24 Uhr

Sieht so aus als ob die Exception während des Builds auftritt, da wird der Debugger ziemlich wenig nützen. Hast du vielleicht irgendwas (manuell) an der Projektdatei geändert? Ansonsten mal das bin/ und obj/ Verzeichnis entfernen und nochmal versuchen.

15.01.2016 - 14:41 Uhr

In Dein Domain Layer sollte überhaupt keine Logik rein.

Dazu hat man doch überhaupt erst den Domain Layer, zumindest wenn es nach DDD geht. Ansonsten bekomm man am Ende ein Anemic Domain Model. POCOs kann man trotzdem noch nutzen, eben um mit der DB zu kommunizieren.

29.12.2015 - 20:13 Uhr

Du solltest noch den TKey-Typ mit where TKey : IComparable<TKey> einschränken, damit der Compiler seinen Job tun kann und du nicht casten brauchst.

Grüße

10.11.2015 - 18:42 Uhr

sind keine Typen zulässig die nicht nullable sind?

So eine Einschränkung gibt es nicht, schließlich gibt es ja auch andere Properties, die entweder den Typ bool oder irgendwelche Enums haben, u. a. auch Visibility.

Da muss also irgendwo anders etwas schief gehen. Ich meine ich hätte schon mal einen ähnlichen Helper (IsVisible Attached Property) gebaut, der aber nicht so gut funktioniert hat wie Binding + Converter. Lag glaube ich daran, dass der Wert des VMs erst gelesen wurde, wenn PropertyChanged ausgelöst wurde. Der Initialwert wurde ignoriert.

06.11.2015 - 13:13 Uhr

Visibility hat in WPF nicht den Typ bool.


ImgBar.imgEmail.SetVisibility((bool)e.NewValue, true);

Das ist vermutlich dein Fehler.

Warum leitest du überhaupt von einem StackPanel ab, anstatt ein UserControl zu erstellen?

21.10.2015 - 17:56 Uhr

Zum Loggen könntest du Serilog ausprobieren. Damit kannst du nicht einfach nur Strings loggen sondern komplette Objekte. Das Schreiben passiert dort ebenfalls asynchron, also blockiert da nichts.

07.10.2015 - 18:11 Uhr

Deine DetailseiteVM-Klasse muss natürlich auch PropertyChanged auslösen, sonst bekommt die GUI die Änderung nicht mit.

05.10.2015 - 15:38 Uhr

Wahrscheinlich versucht VS diese Einstellungen aus seiner eigenen .config-Datei zu lesen. Besser wäre es aber den DB-Zugriff zu abstrahieren - Stichwort Repository.

04.10.2015 - 11:26 Uhr

Hallo,

ich verwende als Client nur noch Paket. Das Tool hat ein viel besser durchdachtes Konzept was SemVer angeht, schon beim Definieren der Abhängigkeiten. Beim Packen werden diese Definitionen auch gleich in die generierte .nuspec übernommen, also wenn du z. B. sagst nuget Foo ~> 2.0, dann bekommst du beim Packen [2.0,3.0).

Das (automatische) Generieren der paket.template (Äquivalent der .nuspec) ist ebenfalls einfacher, weil es ein simples Plain-Text-Format ist.

Zum Pushen hat es auch einen Befehl, also braucht man keine NuGet.exe mehr 😁

Als Build-Tool benutze ich FAKE, das hat auch einen Helper für Paket. Für NuGet und andere Tools, die so in der .NET-Community geläufig sind, übrigens auch.

Grüße

15.09.2015 - 19:42 Uhr

Auch in C# ist es so, dass wenn du ein Array z. B. mit var foo = new int[10]; deklarierst, es auch eine feste Größe hat. Es gibt zwar die Array.Resize-Methode, die kopiert das ursprüngliche Array allerdings einfach in ein neues.

Wie Abt schon geschrieben hat, kommt man (normalerweise) kaum mit blanken Arrays in Berührung, außer man macht irgendwelchen Low-Level-Kram oder etwas hoch optimiertes.

PS: So etwas wie a: array[100..200] of String; gehört für mich eindeutig zur Kategorie Features auf die man verzichten kann. Kann mir keinen Anwendungsfall vorstellen, wo es Sinn macht, die Indizes künstlich in einem Bereich festzulegen.

05.08.2015 - 15:53 Uhr

var values = new []
{
	new { SP1 = "A", SP2 = "C", Date = new DateTime(2000, 1, 1) },
	new { SP1 = "A", SP2 = "C", Date = new DateTime(2004, 1, 1) },
	new { SP1 = "A", SP2 = "C", Date = new DateTime(2008, 1, 1) },
	new { SP1 = "A", SP2 = "D", Date = new DateTime(2006, 1, 1) },
	new { SP1 = "B", SP2 = "C", Date = new DateTime(2002, 1, 1) },
	new { SP1 = "B", SP2 = "D", Date = new DateTime(2006, 1, 1) },
	new { SP1 = "B", SP2 = "D", Date = new DateTime(2008, 1, 1) }
};

values
	.OrderBy(item => item.SP1)
	.ThenBy(item => item.SP2)
	.ThenBy(item => item.Date)
	.ToList()
	.ForEach(item => Console.WriteLine("{0}  {1}  {2}", item.SP1, item.SP2, item.Date.ToString("dd.MM.yyyy")));

Ist die ThenBy-Methode das was du suchst?

24.07.2015 - 08:31 Uhr

WPF im Browser - also Silverlight [...]

WPF im Browser (XBAP) != Silverlight. https://social.msdn.microsoft.com/Forums/vstudio/en-US/8bdff32d-6666-457c-8788-41b2c314bba1/wpf-browser-application?forum=wpf

Wenn du dasselbe Programm überall laufen lassen willst (also nicht nur Windows PCs, sondern auch Android, iOS, OSX usw), bist du wohl mit einer Web-Applikation am besten beraten. Hängt aber auch von anderen Faktoren ab.

WPF jedenfalls läuft nur auf Windows.

Grüße

23.07.2015 - 07:44 Uhr

Guten Morgen,

Dein Methodenaufruf:


sb.AppendCollection(ListOfMyObjects, converter.ConvertMyObjectToString, 3);

wird beim Kompilieren zu so etwas wie:


sb.AppendCollection<MyObject>(ListOfMyObjects, new Func<MyObject, int, string>(converter.ConvertMyObjectToString), 3);

Da gibt es also gar keinen "parameterlosen Methodenaufruf". Der C#-Compiler weiß nur, dass wenn irgendwo ein Delegate erwartet wird, und eine Methode angegeben ist, dass er dies in einen Delegate verpacken muss.

Grüße

Edit: Weil es eine Erweiterungsmethode ist, sieht es eher so aus:


Extensions.AppendCollection<MyObject>(sb, ListOfMyObjects, new Func<MyObject, int, string>(converter.ConvertMyObjectToString), 3);

20.07.2015 - 20:33 Uhr

Hallo,

du definierst den Timer als lokale Variable in deiner Methode. Irgendwann, wenn der Garbage Collector zum Zuge kommt, wird er aufgeräumt. Deshalb wird das Bild später nicht mehr aktualisiert.

Grüße

17.07.2015 - 15:30 Uhr

Hallo,

ich kann dir ebenfalls FAKE empfehlen.

Damit kannst du deine Solution/Projekte bauen, Tests ausführen, NuGet-Pakete packen und was man sonst noch automatisieren kann. Es gibt Tasks für alle möglichen Tools (Paket, NuGet, MSBuild, xUnit ...) und das ganze .NET-Framework steht dir zur Verfügung. F# zu schreiben macht auch mehr Spaß als XML (NAnt, MSBuild) oder Batch 😉

Ist nebenbei gesagt auch eine nette Möglichkeit F# auszuprobieren.

Grüße

11.07.2015 - 14:38 Uhr

Du brauchst ein ControlTemplate mit einem ContentPresenter, sonst hast du kein Element das den Inhalt aufnehmen kann.

Grüße

29.06.2015 - 20:30 Uhr

[...] können aus anderen Quelldateien aufgerufen werden. Dies geht bei Nested Klassen nicht.

Stimmt nicht. Auch nested Klassen können angesprochen werden, vorausgesetzt sie sind entsprechend sichtbar. Geht so: var b = new ClassA.ClassB().

24.06.2015 - 17:17 Uhr

Hindert dich doch keiner daran eine ältere Version zu installieren. Geht halt nicht über die UI, sondern über die Package Manager Konsole:


Install-Package SharpDX -Version 2.5.0

11.06.2015 - 20:50 Uhr

@FZelle: Der VB.NET-Compiler macht das immer noch, siehe dieses Beispiel. Die Roslyn-Variante ebenfalls. Und ich befürchte dass dieses "Feature" nicht so schnell aus VB verschwinden wird.

02.06.2015 - 19:19 Uhr

Hi,

wäre Markdown eine Option? FSharp.Formatting kann aus Markdown HTML und sogar LaTeX erzeugen, ansonsten kann man das Dokument auch selber durchgehen und was eigenes generieren.

Grüße

04.05.2015 - 18:57 Uhr

Zur Info: Mono unterstützt bereits seit einiger Zeit Windows Forms. Mehr Infos auf der offiziellen Seite des Projekts. So abwegig ist dein Traum also gar nicht. Hab jetzt kein Mono auf meinem Mac installiert, kann nicht aus erster Hand berichten wie gut es funktioniert.

Zu deiner ursprünglichen Frage: Wenn du ein .NET v3.5 Projekt erstellst, dann ist die Version der Laufzeitumgebung 2.x. Framework- und CLR-Version korrespondieren nicht unbedingt 1:1.

03.04.2015 - 16:36 Uhr

Am DataTemplate hat das Binding überhaupt nichts zu suchen. Das ist nur dazu da, dass du festlegen kannst, wie ein Objekt dargestellt wird. Nicht mehr und nicht weniger. Manche Frameworks können diese DataTemplates automatisch erstellen, z. B. anhand von Namenskonventionen. Ändert aber nichts daran dass sie da sind.

Das Binding kommt z. B. an ein ContentControl:


<Window>
  <ContentControl Content="{Binding Workspace}"/>
</Window>

Der C#-Code dazu könnte so aussehen:


class MainViewModel
{
  public IWorkspaceViewModel Workspace { get; set; }
}

interface IWorkspaceViewModel { }

class CreateTaskViewModel : IWorkspaceViewModel { }

class AllTasksViewModel : IWorkspaceViewModel { }

Vorausgesetzt du meinst das so.

Den ViewModelLocator solltest du eigentlich nur beim MainViewModel benutzen, vielleicht noch zum Designen.

03.04.2015 - 13:34 Uhr

Dadurch dass du den ViewModelLocator benutzt, wird die Zuordnung von View und ViewModel-Typ nicht überflüssig (also das DataTemplate). Der Locator ist nur eine kleine Hilfe um die ViewModel-Objekte zu verwalten.

26.03.2015 - 19:16 Uhr

Meinst du vll. das? VS hat nämlich so einen Modus, wo es weniger "aggressiv" mit dem Einfügen von Vorschlägen ist.

14.03.2015 - 13:09 Uhr

Du könntest deiner MyControl-Klasse eine DependencyProperty vom Typ ICommand geben, daran das Command aus dem VM binden und dann in deiner OnCanExecute-Methode mit der DependencyProperty arbeiten. Das gleiche machen doch im Prinzip auch die ICommandSource-Klassen in WPF.

24.02.2015 - 19:37 Uhr

Hi,

da muss man nichts selber bauen, die Windows API bietet diese Funktion bereits. Folgenden Code habe ich mal (fast genauso) in einem Blog oder Artikel gefunden, weiß leider nicht mehr wo.


    [StructLayout(LayoutKind.Sequential)]
    public struct RECT
    {
        public int Left;
        public int Top;
        public int Right;
        public int Bottom;

        public RECT(int left, int top, int right, int bottom)
        {
            Left = left;
            Top = top;
            Right = right;
            Bottom = bottom;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct POINT
    {
        public int X;
        public int Y;

        public POINT(int x, int y)
        {
            X = x;
            Y = y;
        }
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct WINDOWPLACEMENT
    {
        public int length;
        public int flags;
        public int showCmd;
        public POINT minPosition;
        public POINT maxPosition;
        public RECT normalPosition;
    }

    public static class WindowPlacement
    {
        private const int SW_SHOWNORMAL = 1;
        private const int SW_SHOWMINIMIZED = 2;

        public static void SetPlacement(IntPtr windowHandle, WINDOWPLACEMENT placement)
        {
            placement.length = Marshal.SizeOf(typeof(WINDOWPLACEMENT));
            placement.flags = 0;
            placement.showCmd = placement.showCmd == SW_SHOWMINIMIZED ? SW_SHOWNORMAL : placement.showCmd;
            NativeMethods.SetWindowPlacement(windowHandle, ref placement);
        }

        public static WINDOWPLACEMENT GetPlacement(IntPtr windowHandle)
        {
            var placement = new WINDOWPLACEMENT();
            NativeMethods.GetWindowPlacement(windowHandle, out placement);
            return placement;
        }

        private static class NativeMethods
        {
            [DllImport("user32.dll")]
            public static extern bool SetWindowPlacement(IntPtr hWnd, [In]ref WINDOWPLACEMENT lpwndpl);

            [DllImport("user32.dll")]
            public static extern bool GetWindowPlacement(IntPtr hWnd, out WINDOWPLACEMENT lpwndpl);
        }
    }

Ich habe leider noch nicht ausprobieren können wie gut das funktioniert, wenn ein Monitor nicht mehr da ist. Wenn du möchtest kannst du mich aufklären 😉

Ich würde diesen Code vielleicht als Behavior implementieren, um diese Funktion auch mit anderen Fenstern nutzen zu können.

Grüße

08.02.2015 - 14:43 Uhr

Das einzige was mir beim überfliegen aufgefallen ist: du benutzt eine List<T>, du brauchst aber eine ObservableCollection<T>. Das sollte es eigentlich schon gewesen sein.

Grüße

29.01.2015 - 21:22 Uhr

Hallo,

der Zweck des ViewModels ergibt sich wenn du verstehst was der Name sagt: "View Model". Bedeutet, es ist ein abstraktes Modell der Ansicht. Das heißt du hast nicht unbedingt eine ViewModel-Klasse pro Model-Klasse sondern jeweils eine ViewModel-Klasse pro Teil der Ansicht. Also für jeden Dialog, jedes Fenster usw.

Lies dir dazu diesen Artikel durch. Für den Einstieg finde ich den sehr gut.

Es wird dir wahrscheinlich klarer werden wenn deine Programmlogik aus mehr besteht als aus schulbuchmäßigen Beispielen à la "Person.Essen()" oder "Auto.Fahren()" 😉

Grüße

13.01.2015 - 23:09 Uhr

Die TextBox ist nicht ansprechbar weil sie in einem DataTemplate definiert ist. Das Template wird dann auf jedes Element angewendet. Du verwendest doch schon offensichtlich Datenbindung, warum bindest du nicht ebenfalls die IsEnabled-Property?

28.12.2014 - 14:05 Uhr

Ich versuch jetzt mal besser auf deinen ersten Beitrag einzugehen.

Im Taskmanager sieht man das ganze aber nicht. Dort ist nur die MainProgram.exe aktiv.

Du siehst ja auch nicht dass z. B. die mscorlib "läuft". Das sind aber Grundlagen.

Wenn ich den Projekttyp auf DLL ändere, erhalte ich eine Fehlermeldung und kann die Projektmappe nicht kompilieren.
Erst nachdem ich die App.xaml gelöscht habe, liess die das "Tool" als DLL kompilieren.

Das ist richtig so. Durch die App.xaml wird eine Main-Methode generiert, welche als Einstiegspunkt dient. Eine reine Klassenbibliothek darf aber keinen Einstiegspunkt besitzen.

Kann sein, dass bei WinForms-Projekten die Main-Methode anders generiert wird und es deswegen kein Problem ist, den Projekttyp zu ändern. Bei Interesse einfach die Lieblingssuchmaschine bemühen.

Wenn du also eine Klassenbibliothek mit WPF-Oberfläche haben willst, kannst du eine Klassenbibliothek erstellen und die Verweise zu den Assemblies von WPF selber hinzufügen. Genau das macht im Grunde auch der Assistent von Visual Studio. Etwas einfacher gehts mit der Benutzersteuerelement-Bibliothek, läuft aber aufs gleiche hinaus.

Und nebenbei gesagt: MVVM ist nicht (nur) die Zukunft. Es ist eine Weiterentwicklung dessen, was schon seit Ende der 70er-Jahre angestrebt wird, siehe auch MVC-Pattern. Ich glaube vor allem Desktop-Entwickler (aus dem Windows-Umfeld) tun sich damit schwer, das zu verstehen. Möglicherweise weil die Arbeitsweise aus VB6-Zeiten noch in den Entwickler-Genen steckt und von Generation zu Generation weitergegeben wird.

Grüße

28.12.2014 - 11:49 Uhr

Hallo,

du kannst unter .NET jede Assembly, egal ob .exe oder .dll, referenzieren und deren Klassen benutzen, denn unter .NET ist eine .exe im Grunde nichts anderes als eine .dll mit einem Einstiegspunkt.

Ich denke dein Problem liegt eher hier:


ToolWindow window = new ToolWindow();
TabItem.Content= window.content;

Ich glaube nämlich nicht dass das so funktioniert. Und unter WinForms kann ich es mir noch weniger vorstellen.

Schau dir vorsorglich schon mal [Artikel] Drei-Schichten-Architektur und [Artikel] Unit-Tests: Einführung in das Unit-Testing mit VisualStudio an. Das sind nämlich die beiden größten Vorteile, die man sich von einem Umstieg auf WPF erhofft. Viele vergessen das, weil sie glauben WPF bringe nichts weiter als schöne Animationen und stylische Oberflächen.

Macht es denn überhaupt Sinn, dass deine "Unterprogramme" als eigenständige Programme ausführbar sind?

26.11.2014 - 17:33 Uhr

Hallo,

du könntest, wenn du keine Attached Property definieren willst, auch die Tag-Property des Buttons dazu benutzen. Die Orientation-Property des StackPanels bindest du dann an die Tag-Property des Buttons.

Hat aber natürlich den Nachteil, dass a) der Wert des Tags nicht typisiert ist (object) und b) du auch nicht verhindern kannst, dass jemand den Wert einfach überschreibt.

Ich persönlich würde lieber eine Attached Property definieren.

Grüße

09.11.2014 - 14:29 Uhr

Hallo,

Wie bekomme ich die Combobox in das Command?

Das ist der falsche Ansatz. Bei MVVM geht es ja u. a. darum, nicht direkt mit Controls zu arbeiten.

Stattdessen sollte die ItemsSource-Property deiner ComboBox an eine Liste im VM gebunden sein, diese Liste kannst du doch dann im Command befüllen.

Grüße