Kann man in Visual Studio 2022 die Werte einer Enumeration anzeigen lassen? Wenn ich XAML-Code erstelle, zeigt mir IntelliSense nichts an:
<Window.InputBindings><MouseBinding MouseAction=" ">
Entschuldigung, dass ich es falsch formuliert hatte, aber ich hatte noch nie behauptet, dass ich MVVM verwende.
Ich arbeite mit MVC-Pattern wegen Verwendung von RoutedUICommands in separaten Namespaces (die sind in MVVM gar nicht möglich) statt mit generischen Action<> und Func<>-Delegates.
MVVM ist doch erst bei größeren Anwendungen sinnvoll aufgrund des Overheads
Ich habe ein MainWindow mit diversen Page-Instanzen erzeugt, die durch Clicks angezeigt werden.
Bei Clicks funktioniert im Programm auch alles, aber der Debugger zeigt mir zig BindingExpression-Fehler an. Muss ich die aktuell angezeigte Page bei einem Click immer zerstören? Und wie geht das?
public partial class Page_1 : Page
{
public static MainWindow haupt;
public Page_1(ref MainWindow mw)
{
InitializeComponent();
mw.DataContext = ...
in meinem Programm sind mehrere Collections enthalten und wenn eine andere ausgewählt wird, muss ich ja meine TaskbarItemInfo mit den (Vor/Zurück)-Buttons anpassen. Ich bekomme aber immer nur einen Fehler: > Fehlermeldung:
Der String kann nicht in "System.Windows.Input.ICommand" konvertiert werden.
Auch die Lösungsvorschläge von VS zeigen alle denselben Fehler an. Wie kann ich einen bestehenden Command korrekt hinzufügen?
<Window.TaskbarItemInfo>
<TaskbarItemInfo Description="{Binding Description}" >
<TaskbarItemInfo.ThumbButtonInfos>
<ThumbButtonInfo x:Name="tbi_re" ... />
ThumbButtonInfo tbi = (ThumbButtonInfo)this.TryFindResource("tbi_re");
ICommand x = (ICommand) "{x:Static local:Commands.GotoPrevious}");
tbi.Command = x;
Wieso verwendet C# eigentlich ein separates Typsystem mit Wertetypen? Denn eigentlich lassen sich diese ja auch alle auf Klassen zurückführen und wären somit Referenztypen.
Sind Wertetypen nur eine lose Festlegung oder gibt es einen bestimmten Grund für die Deklaration?
Versuchs mal mit folgender Reihenfolge. Wenn die Farbe keine Rolle spielt, müsste es klappen
<Border Background="Yellow" Margin="50" CornerRadius="90" ClipToBounds="True" />
<Rectangle Opacity="0.8" Width="400" Height="300" Fill="White" Margin="-200 0 200 0"/>
Ich möchte den Content eines Labels mit einer Methode befüllen und habe mir hierzu einen ObjectDataProvider erstellt:
<ObjectDataProvider x:Key="text" ObjectType="{x:Type local:MainWindow}" MethodName="Ausgabe"/>
die Methode Ausgabe() liefert auch nur einen String, in der Vorschau wird sogar alles korrekt angezeigt, aber beim Kompilieren kommt immer nur 10x die Fehler-Meldung:
Fehlermeldung:
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(4206,5): warning MSB3026: "obj\Debug\ODP.exe" konnte nicht in "bin\Debug\ODP.exe" kopiert werden. Wiederholung 1 wird in 1000 ms gestartet. Der Prozess kann nicht auf die Datei "bin\Debug\ODP.exe" zugreifen, da sie von einem anderen Prozess verwendet wird. Die Datei wird durch "ODP (12764)" gesperrt.
was mache ich denn falsch?
Ich habe ein MainWindow mit DockPanel für einen Frame und einer DependencyProperty, auf die in der StatusBar verwiesen wird.
<Label Content="{Binding X, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
wenn ich nun im Frame die DependencyProperty ändere, geht das obige Binding einfach verloren, statt sich anzupassen.
public Frame(ref MainWindow haupt)
{
InitializeComponent();
haupt.X = "neu";
}
wird UpdateSourceTrigger im MainWindow nicht ausgeführt, weil ich mich in einem anderen Frame befinde?
ich gehe davon aus, dass du mit WPF-Elementen arbeitest.
Dann mach doch direkt einen Binding-Befehl mit 2Way-Modus! Einfacher gehts doch nicht
wenn du Regex nicht kennst oder willst:
durchsuch halt deinen ersten String mit IndexOf() nach einem Zeichen, so kriegst du die Index-Nummer. Dann kannst du dir einen Teilstring erstellen
ich habe eine TextBox zum Anzeigen und Ändern von Geldbeträgen. Eine falsche Eingabe soll einen roten Rahmen erzeugen. Ich versuchte dies mit einer Validation Rule, aber plötzlich kann ich die Zeichen ',' und '.' nicht mehr in die TextBox eingeben (alle anderen gehen). Was mache ich falsch?
<TextBox Name="basicPreis">
<Binding Path="Betrag" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<local:BetragValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox>
Die ValidationRule lautet:
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
string wert = value as string;
try
{
double val = Convert.ToDouble(wert);
return ValidationResult.ValidResult;
}
catch
{
return new ValidationResult(false, "Keine Zahl");
}
}
Ich habe ein Rechteck aus aneinandergehängten Dreiecken (im Anhang ist ein Bild), das ich in ein Kreisdiagramm umwandeln möchte. CombinedGeometry akzeptiert die Polygon-Objekte nicht. Gibt es noch eine weitere Möglichkeit zum beschneiden?
<Canvas Name="can" >
<Polygon Name="pol1" Fill="Aqua" />
<Polygon Name="pol2" Fill="Green" />
<Polygon Name="pol3" Fill="Yellow" />
<Polygon Name="pol4" Fill="Gray" />
<Polygon Name="pol5" Fill="Blue" />
<Polygon Name="pol6" Fill="Beige" />
<Polygon Name="pol7" Fill="Pink" />
</Canvas>
Du kannst den String splitten mit der Methode Split(). Gib als Zeichen dann ',' an. Du bekommst so ein Array mit deinen Zahlen
Stopwatch uhr = new Stopwatch(); // am Anfang
uhr.Start(); // beim Erscheinen
mit einem Event reagierst du auf ein Klicken und gibst in der Event-Behandlung eben uhr.Stop(); an
Du musst in der Ausgabe der Farbe eine Länge angeben, bspw. 10:
Console.WriteLine("... {0,10}...", variable)
Wo kann man die Dokumentation von C# finden, wo die kompletten Änderungen beschrieben werden?
Es wurden ja auch grundlegende Methoden entfernt (bspw. Thread.Abort), was heftige Fehler verursacht.
Was bringen mir sonst Neuerungen, wenn ich sie gar nicht kenne?
mach dir gleich eine Klasse mit passendem Konstruktor. Struct ist auch nur die "Einschränkung" einer Klasse
ich habe dem DockPanel-Bereich den Frame (mit der CheckBox) nochmals erneut zugewiesen, damit sich die Ansicht aktualisiert. So wird ja der Frame erneut geladen - was InitializeComponent() ausführt.
Page p = new FrameX();
haupt = p;
// Checkbox in p aktualisiert, und jetzt die Page erneut zugewiesen
haupt = p;
Ich dachte, dass Änderungen an der Ausgabe automatisch angezeigt werden, aber es klappte doch nicht. Erst als ich dann Frame p erneut zuwies, wurde die Ansicht aktualisiert
Danke für den Hinweis, ich habs weiter probiert und die Lösung gefunden:
die Bindung war schon zu Beginn korrekt erfolgt (Abfrage mit Debug), aber ich musste nochmal 'InitializeComponent()' aufrufen, damit die Ansicht der anfangs leeren CheckBox aktualisiert wurde.
ich möchte einige WPF-Elemente an Werte aus einem Array binden. Mit TextBox und DatePicker klappt auch alles, aber ich komme einfach nicht drauf, wie ich eine CheckBox an einen Bool-Wert binden kann.
Ich habs schon mit DataContext, Checked und IsChecked probiert! Die CheckBox bleibt immer leer - wie kann man eine Bindung an eine Boolean-Variable realisieren?
Ich habe eine ListView mit Objekten, die u.a. eine DateTime-Eigenschaft enthalten. Zum Editieren soll das selektierte Objekt in diversen Boxen angezeigt werden (DatePicker, TextBox,...). Die Bindung funktioniert auch überall, bis auf DatePicker. Ich hab es schon mit DataContext, DisplayDate und SelectedDate versucht. Die Objekte sind recht einfach aufgebaut:
public class Termin
{
private DateTime? _datum;
private String _ort;
private Int32? _dauer;
private Boolean _bemerkt;
...
}
Im ListView funktioniert die Datenbindung problemlos
<ListView ItemsSource="{Binding TerminView, Mode=OneWay}" >
<ListView.View><GridView>
...
<GridViewColumn DisplayMemberBinding="{Binding Datum.Value}" Header="Datum" />
</GridView></ListView.View></ListView>
und auch in den einzelnen Boxen. Aber in DatePicker zeigt es immer nur "Datum auswählen" an. Was mache ich falsch?
<DatePicker DataContext="{Binding Datum}" DisplayDate="{Binding Value}" Name="Datum" />
<TextBox DataContext="{Binding Ort}" Text="{Binding Value}" Name="Ort" />
führe doch einfach eine Konvertierung in eine Zahl durch, bspw. mit (Convert.ToDouble()
dann kannst du mit if checken, ob dabei ein Fehler auftritt oder nicht...
Ich versteh den Sinn nicht:
?(
Du musst doch wissen, was du programmieren willst! Und VisualStudio zeigt dir in einem Klappfenster doch immer alle vorhandenen Methoden an
Wenn ich bei MVVM-Projekten den Namespace ändere, kommen oft Fehler wie 'InitializeComponents wird nicht mehr gefunden' trotz Neukompilierung!
Neuladen der Projektmappe hilft nichts, wenn ich jedoch Visual Studio beende und neu starte, ist der Fehler weg.
Ich arbeite mit VS2017 Community Version 15.1
Wäre es nicht sinnvoller, erst mal die Grundlagen von C# komplett zu lernen?
Es gibt tolle Bücher! Ich will keine Werbung machen, aber schau dir mal von Andreas Kühnel 'C#6 mit Visual Studio 2015' an - das wirst du nie bereuen!
Mach dir halt einen Anonymen Typ oder eine entsprechende Klasse
ich bin doch in einem C#-Forum, oder?
Das Code-Fenster ist auch mit 'C#-Code' beschriftet! Versteh ich irgendwas falsch?
= und == sind nicht dasselbe! In einer if-Anweisung musst du == verwenden zum vergleichen.
bei einem Value-Vergleich musst du entweder .Length() mit 0 vergleichen oder du vergleichst mit NULL. Sonst trifft deine Bedingung nie zu
Wenn du einen String an die Methode übergibst, wird nur eine Kopie verwendet. Deswegen solltest du den Wert mit 'ref' übergeben, damit du das Original bearbeitest.
Wer mit C# ganz von vorne anfangen will, dem empfehle ich folgendes Buch:
Titel: C#6 mit Visual Studio 2015
Verlag: Rheinwerk Computing
Autor: Andreas Kühnel
Wer das Buch mit knapp 1500 Seiten gelesen hat, der hat die Grundlagen von C#6 auch wirklich verstanden und kann darauf aufbauen. Diese 50€ haben sich also auf jeden Fall rentiert.
Mach dir einen Delegaten, den du mit einer Abfrage befüllst. Und dann binde die Delegat-Methode einfach an den Event
Schau mal die Themen 'anonyme Methoden' und 'Lambda Ausdrücke' an
Von Andreas Kühnel ist auch das Buch 'C#6 mit Visual Studio 2015' sehr zu empfehlen, damit du die Grundlagen wirklich verstehst
suche von rechts (for Schleife mit - von length zu 1) nach dem Schrägstrich. So kriegst du eine Position und kannst dann einen Substring erzeugen
Problem gelöst! Die Ursache lag am Style! In App.cs war das ComboBox-Style deklariert mit:
<Setter Property="ComboBox.Width" Value="400" />
In der Wpf-Datei befand sich die ComboBox in einer Spalte mit nur 300. Das aufklappende Menü wird auch breiter dargestellt. So wurden die kurzen linksbündigen Einträge einfach abgeschnitten - ohne jegliche Fehlermeldung!
Die Bindung an eine Enumeration 'enum1' habe ich jetzt hinbekommen mittels
cbox.ItemsSource = Enum.GetValues(typeof(enum1));
es zeigt nun alle Einträge im aufgehenden Klappmenü an, ich kann auch eins auswählen, aber leider wird der ausgewählte Eintrag in der ComboBox direkt einfach nicht angezeigt.
Das wäre doch normalerweise Aufgabe der ComboBox, oder muss ich irgendetwas updaten?
wie kann ich einer ComboBox bei der Initialisierung die erlaubten Werte zuweisen?
Muss ich immer alle selbst mit <ComboBoxItem> hinzufügen, oder kann ich bspw. direkt eine Enumeration zuweisen?
Ich habs schon mit DataContext probiert, aber man darf keine Enumeration angeben
Wenn du nur Bilddateien möchtest, dann probiers doch mit
if(Dateiname.Split('.')[1] == "gif")
du kannst dann ja alle Bildformate mit | hinzufügen
So kannst du aber auch direkt auf '.ini' abfragen und dann bei Bedarf continue ausführen
Seit ich VisualStudio 2017 installiert habe, kann ich das [Serializable] Attribut nicht mehr verwenden. Ich bekomme immer die Fehlermeldung, dass Typ- bzw. Namespacename nicht vorhanden sind.
Ich wollte auch "using System.Runtime.Serialization.Formatters.Binary;" eingebinden, den gibts nicht mehr!
Wer kennt den neuen Namespace, oder ist Serialisierung ausgelaufen?
Das ist ja der Sinn der Objekt-Orientierung! Schreib dir doch selbst ne statische Klasse!
und schon hast du alles selbst geschafft!!! Und kannst die Klasse sogar verkaufen!
Ich hatte ein ähnliches Problem! Kein DB-Zugriff mehr seit ich mit VS15 und Win10 arbeitete!
con.ConnectionString = "Data Source=(localdb)\\MSSQLLocalDB; Initial Catalog=Daten; Integrated Security=sspi"; con.Open();
string s = "INSERT INTO dbo.Egal VALUES(...)";
SqlCommand c = new SqlCommand(s, con);
c.ExecuteNonQuery();...
Such doch mal nach einer Bibliothek mit Render-Klassen für HTML-Dateien.
Für pdf-Dateien bietet ja bspw. Adobe auch eine entsprechende Möglichkeit an mit einer print-Methode
Ich arbeite mit Visual Studio Community 2015. Da hab ich mir eine eigene Vorlage erstellt, alles klappt, aber sie wird in der Vorlagen-Liste erst ziemlich weit hinten angezeigt. Kann man irgendwo die Positionierung in der Standard-Darstellung verändern - sonst muss ich jedesmal scrollen?
Alternativ gibt es ja sonst nur Sortierung nach Name (aufsteigend/absteigend)
hab ich auch schon probiert - das gleiche Problem!
Ich verstehe einfach nicht, wieso ich in VisualStudio im 'SQL-Server-Objekt-Explorer' direkt eine Anfrage an Northwind absenden kann, und ich bekomme ohne Probleme eine Ergebnisliste
nur im C#-Code klappt keine Verbindung zu alten MDF's. Wenn ich eine neue Datenbank erstelle, dann gehts ja schließlich auch.
Du brauchst für jeden 'Indikator' eine Variable, wo du den Wert reinkopierst - es langt ja der object-Typ. Dann kannst du mit einer Schleife (if oder switch) einfach die Variablen auf NULL abfragen und entsprechend eine jeweilige Methode aufrufen.
In der Methode muss du die Parameter natürlich mit PARAM definieren, dann wird abhängig von der Anzahl der vorhandenen Parameter die passende Version ausgeführt
Seit ich Windows 10 hab, ist der SQL Server 2016 installiert und ich kann mit C# auf keine Datenbank mehr zugreifen
using System.Data.SqlClient;
...
SqlConnection con = new SqlConnection();
try {
con.ConnectionString = "Data Source=(local); Initial Catalog=Northwind; Integrated Security=sspi";
con.Open();
} catch ...
wie macht ihr eure Datenbankzugriffe?
Vielen Dank für die Hilfe, ich hatte nicht unter englischen Stichworten gesucht.
ScrollViewer hatte ich nur als Eigenschaften probiert, aber kein allumfassendes ScrollViewer-Element um den Frame erstellt.
Ich möchte -ähnlich wie im Internet- in einem größen-definierten Frame mehrere Page-Objekte anzeigen, die durch ein Menü ausgewählt werden können.
Das funktioniert auch problemlos, aber diese haben unterschiedliche Größen und ich schaffe es nicht, dass automatisch eine Scrollbar angezeigt wird, wenn der Platz nicht ausreicht!
Wie kann man so etwas erreichen, oder ist das nur bei HTML möglich?