WPF Bewegbar machen, funktioniert nicht?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Da hast Du wohl ein etwas merkwürdiges Verhalten von WPF (WTF :P) entdeckt, an dem ich vor ein paar Jahren auch Mal hing :D

Weißt Du, wie die Events von WPF funktionieren? Wenn nicht, lies dich ein, Stichwort: "Event Bubbling"

In sehr kurz: Wen Du als Nutzer etwas anklickst, wird dieses Click-Event so lange im VisualTree nach oben "gereicht" (wie Blubberblasen, die nach oben steigen), bis es bei einem Control ankommt, was das Event behandelt.

Nun gibt es da aber Unterschiede bei z.B. Panels (Grid ist ein Panel), die von der Hintergrundfarbe abhängen. Hat das Panel eine Farbe, kann der Nutzer es sehen und somit auch bewusst anklicken. Hat es keine Farbe, wird der Nutzer wahrscheinlich eher die Elemente meinen, die optisch hinter dem Panel liegen, daher bekommt das Panel davon nichts mit.

Dieses Verhalten tritt auf, wenn der Hintergrund null ist und das ist der Standard-Wert. Umgehen kannst Du das, indem Du als Hintergrund Transparent verwendest.

Oder in kurz: Setz an dem Grid, wo Du den Click-Handler registriert hast, Background="Transparent"

===========================

Ich geb dir aber noch zwei Tipps mit:

Tipp Nr. 1: Nutze nicht den Designer. Der mag zwar schön einfach sein, allerdings hat er den Nachteil, dass Du den XAML-Code dabei nur bedingt bis gar nicht verstehst. Außerdem entsteht Code, der nicht wirklich gut ist. Außerdem findest Du so sehr viel mehr Hilfe und kannst besser "feintunen". Du kannst ja übergangsweise den Designer nutzen, um dann das Ergebnis per Hand neuzubauen, so hab ich es auch gelernt und jetzt ist der Designer bei mir standardmäßig deaktiviert.

Tipp Nr. 2: Nutze unbedingt MVVM! WPF ist für das MVVM-Pattern gebaut bzw. Beides ist zeitgleich und füreinander entstanden. Der Einstieg mag zwar etwas schwieriger sein und anfangs wirkt das übertrieben, aber langfristig lohnt sich das definitiv. Außerdem hast Du mit der Zeit den Dreh raus, dass MVVM keinen zusätzlichen Aufwand mehr bedeutet. Ich hab mittlerweile einige Klassen, die mir die Arbeit sehr erleichtern. Wenn Du sowas nicht selber entwickeln willst, kannst Du auch vorhandene MVVM-Frameworks nutzen, ich würde dir aber raten, erst Ohne zu arbeiten, damit Du später weißt, wie das alles zusammenhängt.

25

PS:

Verwende den Debugger! :D Setz einen Breakpoint in deinen Event-Handler und Du wirst fest stellen, der wird nie aufgerufen.

Im zweiten Schritt baust Du ein kleines Mini-Projekt, was nur das Minimum an Funktionen at, die bei dir nicht funktionieren. Wenn es da funktioniert, funktioniert der Code zumindest und Du suchst an der falschen Stelle. Funktioniert es nicht, kannst Du dort im kleinen Ramen testen, woran es liegt.

Der dritte Schritt, wenn Du an der falschen Stelle suchst, wäre gewesen, alles Stück für Stück auf ein Minimum zu reduzieren. Irgendwann funktioniert es dann (hast Du ja vorher sicher gestellt) und dann weißt Du genau, welche Änderung den Unterschied gemacht hat.

0
4

Das mit der Background Color auf Transparent setzen hat geholfen. Vielen Dank

0

Hi,

ich kann leider gerade nichts an einem Windows Rechner ausprobieren deswegen kann ich nur ohne einen 100% sicheren Ansatz Antworten.

Könntest du dann nicht trotzdem an dieses Window dieses MouseDown Event verwenden anstatt extra nochmal ein Grid dafür zu verwenden?

Du könntest sogar einfach das OnMouseLeftButtonDown Event verwenden. Dann brauchst du nicht extra eine IF Abfrage zu nutzen, wenn ich das in diesem Link richtig sehe:

https://stackoverflow.com/questions/1761854/cant-drag-and-move-a-wpf-form

Regards,

LifeArtist

Woher ich das weiß:
Recherche
25

Das Problem ist, dass das Event vom Grid nicht gefeuert wird, wenn der Background = null ist. Das merkt man auch, wenn man einen breakpoint in den Handler setzt - der wird nie aufgerufen ;)

Der Trick ist, den Background auf Transparent zu setzen, dann funktioniert es auch.

1

Ich gehe davon aus, dass das Event nicht gefeuert wird, weil es sehr schwer ist, das Grid mit der Maus zu treffen ... Mach da oben mal ein Elment rein, dass auch auf der ganzen Fläche "berührbar" ist - z.B. ein Rechteck, mit opaque oder auch Farbwechsel.

C# Hashed Passwort aus Datenbank mit Anwendung abgleichen?

Code zum hashen:

private void button1_Click(object sender, EventArgs e)
        {
            byte[] salt;

            new RNGCryptoServiceProvider().GetBytes(salt = new byte[16]);             var hpw = new Rfc2898DeriveBytes(textBox1.Text, salt, 10000);

            byte[] hash = hpw.GetBytes(20);             byte[] hashByte = new byte[38];             Array.Copy(salt, 0, hashByte, 0, 16);             Array.Copy(hash, 0, hashByte, 16, 20);             string hashedpw = Convert.ToBase64String(hashByte);

            textBox2.Text = hashedpw;

        }

In der Datenbank steht dann also das verschlüsselte Passwort. Wenn ich mich über meine Anwendung einloggen möchte (Email und Passwort) dann muss die Anwendung das eingegebene Passwort mit dem Passwort in der Datenbank abgleichen, ob dieses übereinstimmt. Aber wie kann ich denn das verschlüsselte Passwort abgleichen?

MfG

...zur Frage

Was habe ich bei diesen Plugin falsch gecodet?

Ich habe gerade ein Wartungsplugin gecodet und die Commands die ich programmiert habe funktionieren nicht wo liegt der Fehler ? Code:

package de.pxlbst.wartungsplugin.main;

import org.bukkit.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.command.Command; import org.bukkit.command.CommandSender; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.AsyncPlayerPreLoginEvent.Result; import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.plugin.java.JavaPlugin;

public class Main extends JavaPlugin implements Listener{

    boolean wartung = false;
   
    @Override
    public void onEnable() {
            Bukkit.getPluginManager().registerEvents(this, this);
           
            wartung = getConfig().get("WartungsPlugin.status.status") != null ? getConfig().getBoolean("WartungPlugin.status.status") : false;
            
            initConfig(); 
        
    }
    
    private void initConfig(){
        saveConfig();
        
        this.getConfig().options().header("Wartungs - Plugin - by PXLBST - Bitte passe auf Groß- und Kleinschreibung, sowie auf Leerzeichen auf!");
        this.getConfig().addDefault("WartungsPlugin.messages.kick", "§cDer Server ist im WartungsModus!");
        this.getConfig().addDefault("WartungsPlugin.motd.motd", "§cDer Server ist im WartungsModus!");
        this.getConfig().addDefault("WartungsPlugin.messages.on", "§aDu hast den Wartungs-Modus aktiviert!");
        this.getConfig().addDefault("WartungsPlugin.messages.off", "§c§4Du hast den Wartungs-Modus deaktiviert!");
        this.getConfig().addDefault("WartungPlugin.status.status", false);
        this.getConfig().options().copyDefaults(true);
        this.saveConfig();
        System.out.println("[WartungsPlugin] Succesfully (re)loaded config.yml!");

    }
   
    @EventHandler
    public void onLogin(AsyncPlayerPreLoginEvent event){
     if(wartung){
             
             
             for(OfflinePlayer op : Bukkit.getWhitelistedPlayers()){
                     if(op.getName().equalsIgnoreCase(event.getName())){
                             return;
                     }
             }
             
             if (!Bukkit.getOfflinePlayer(event.getName()).isOp()) {
             event.disallow(Result.KICK_OTHER, this.getConfig().getString("WartungsPlugin.messages.kick"));
             }
     }
    }
   
    @EventHandler
    public void onPing(ServerListPingEvent event){
     if(wartung){
             event.setMaxPlayers(0);
             event.setMotd(this.getConfig().getString("WartungsPlugin.motd.motd"));
     }
    }
   
   
    @Override
    public boolean onCommand(CommandSender sender, Command command
...zur Frage

WPF Combobox Text Markierung. Wie kann ich sie entfernen?

Ich möchte eine WPF Anwendung erstellen. Es soll eine ComboBox geben in der man Suchbegriffe eingibt welche dann gespeichert werden und wenn beim nächsten suchen ein ähnliches Wort kommt soll sich die Combobox öffnen, das klapp auch schon soweit, nur das Problem ist dass wenn ich einen Buchstaben reinschreibe und sich dann die ComboBox öffnet wir der Text in der ComboBox markiert und mit der nächsten Taste die ich drücke wird der Buchstabe durch den anderen ersetzt. Wie kann ich nun bei meiner WPF Anwendung verhindern dass der Text in der ComboBox markiert wird? Der Text soll NIE markiert werden, vorallem nicht wenn sich das DropDownMenu öffnet. Bitte um schnelle Hilfe!

LG

lp12

...zur Frage

C# Abbrechen-Button?

Hallo, ich habe ein Problem mit meiner Anwendung. Ich habe eine Form die heißt z.B. Form1 und eine Form2. Beim klick auf den Hinzufügen-Button in Form1 öffnet sich Form2 (dort sollen dann Daten in Textboxen eingegeben). Wenn ich dann auf den Speichern-Button klicke werden diese eingegebenen Daten in eine Datenbank gespeichert und in einem Datagridview in Form1 angezeigt. Das Problem hierbei ist, der Abbrechen-Button in Form2 funktioniert nicht (beim klick auf den Abbrechen-Button soll man wieder zurück zu Form1 kommen). Ich habe eine Datenbank Kontext Klasse "PersonDbContext" in der zwei Methoden sind, einmal zum hinzufügen und einmal entfernen einer Person aus dem grid sowie Datenbank.

DbContext:

public class PersonDbContext : DbContext
	{
		public DbSet<Persons> Person { get; set; }
    public void AddPerson(Persons person)
    {
        Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

    public void RemovePerson(Persons person)
    {
        Person.Attach(person);
        Entry(person).State = EntityState.Deleted;
        SaveChanges();

        MessageBox.Show(@"Person wurde erfolgreich gelöscht.");
    }
}

Form1:

private void buttonHinzufügen_Click(object sender, EventArgs e)
		{
			var dlg = new PersonDialog();
			dlg.ShowDialog();
			var person = dlg.Persons;
        _db.AddPerson(person);
        _db.SaveChanges();
    }

PersonDialog ist die 2. Form die sich dann öffnet (Form2).

Wenn ich auf meinen Abbrechen-Button in meiner 2. Form klicke bekomme ich immer den Fehler das der Wert nicht null sein darf.

Also im DbContext in der AddPerson-Methode heißt es dann der Wert darf nicht null sein (bei Person.Add(person);

public void AddPerson(Persons person)
		{
            //Wert darf nicht null sein.
    		Person.Add(person);
        SaveChanges();
        MessageBox.Show(@"Person wurde erfolgreich hinzugefügt.");
    }

Wenn ich aber eben keine Person hinzufügen will (keine Daten in Form2 eingeben will) ist es null. Ich muss sogesehen eine neue Person hinzufügen und die dann per Löschen-Button in Form1 wieder entfernen weil ich sonst ja die Exception kriege. Also wie bringe ich den Abbrechen-Button in Form2 zum laufen (damit es egal ist ob der Wert null ist bzw halt nichts eingegeben wurde)?

Danke euch. :)

...zur Frage

C# - Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird?

Hallo, ich habe ein Problem mit meiner programmierten Anwendung. Immer wenn ich auf den Erstellen-Button klicke kommt in einer textBox die Meldung:

Der Prozess kann nicht auf die Datei zugreifen, da sie von einem anderen Prozess verwendet wird.

Code:

private void buttonErstellen_Click(object sender, EventArgs e)
		{
			OpenFileDialog ofd = new OpenFileDialog();
			ofd.Filter = "XML|*.xml";
			if (ofd.ShowDialog() == DialogResult.OK)
			{
				try
				{
					textBoxPfad.Text = Path.GetDirectoryName(ofd.FileName);
					DeserializeXml(ofd.FileName);
				}
				catch (Exception exception)
				{
					textBoxStatus.Text = exception.Message;
				}
			}
		}
    public void DeserializeXml(string fileName)
    {
        XmlSerializer serializer = new XmlSerializer(typeof(PersonenKonfiguration));
        XmlReader xmlFileReader;
        
        try
        {
            Person personen = new Person { Name = "Mustermann", Vorname = "Max", Wohnort = "Musterstadt" };
            
            xmlFileReader = XmlReader.Create(fileName);
            StreamWriter writer = new StreamWriter(fileName);
            serializer.Deserialize(xmlFileReader);
            writer.Write(personen);
            textBoxStatus.Text = "Validierung abgeschlossen.";
        }
        catch (Exception ex)
        {
            textBoxStatus.Text = ex.Message;
        }
    }

...zur Frage

Wie kann ich mit c# kontrollieren ob Sounds abgespielt werden?

Wie oben geschrieben.

Ich habe eine WPF-Anwendung.

...zur Frage

Was möchtest Du wissen?