Mer C# och WPF frågor

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Mer C# och WPF frågor

Inlägg av TomasL »

Hur gör jag för att känna av att en användare har ändrat innehållet i en textbox, men inte när koden skriver standardvärden.
textchanged eventet skjuter ju av så fort innehållet ändrats, oavsett om det sker programatiskt eller av användaren.
Jag vill alltså enbart veta när användaren ändrar innehållet, och inte när koden ändrar innehållet.

Vad jag vill göra är att fylla i standardvärden om inte användaren fyller i ett värde.
Innehållet i en textbox kan då vara beroende på innehållet i en annan, men enbart om inte användaren ändrar det beroende värdet.

Typ så här:
Vid programstart så fylls alla textboxar med standardvärden.

Om användaren enbart ändrar textbox1 så skall textbox2 få ett nytt värde beroende värdet i textbox1.
Om användaren enbart ändrar textbox2 så skall textbox1 få ett nytt värde beroende värdet i textbox2.
Om användaren ändrar i bägge boxarna så skall boxarna behålla dessa värden.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Mer C# och WPF frågor

Inlägg av johano »

Kan du inte bara sätta en flagga när "programstart" är klar och som sen kollas i TextChanged. Är flaggan inte satt så ignoreras changedkoden?

/j
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Jo, det är väl nånting sånt jag funderat på.
Problemet är ju att veta om det är koden eller användaren som ändrat i textboxen.
Detta då olika delar av programmet skall köras beroende på vem som ändrat texten.
På nått sätt måste jag släcka flaggan om användaren ändrar innehållet, och sätta den om koden ändrar innehållet.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Mer C# och WPF frågor

Inlägg av johano »

Sätt flaggan när programmet gör ändringen och cleara den i textchanged.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

problemet är att textchanged fyras av även när programmet gör ändringen.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Mer C# och WPF frågor

Inlägg av baron3d »

För varje textbox har du en text-variabel.
När programmet ändrar en textbox så sparar programmet även värdet i respektive text-variabel.
När textchanged fyras av så jämför programmet textbox:en mot text-variabeln.
Är dom lika har inte användaren gjort ändringen.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Användaren kan ju faktiskt mata in samma värden.
johano
Inlägg: 1943
Blev medlem: 22 januari 2008, 10:07:45
Ort: Stockholm

Re: Mer C# och WPF frågor

Inlägg av johano »

Du har väl koll på när din programkod ändrar texten? Sätt då flaggan innan koden gör textändringen. I TextChanged kollar du om flaggan är satt, om den är det så vet du att texten ändrats av programmet och resten av koden i TextChanged kan ignoreras. Cleara därefter flaggan innan TextChanged returnerar.

Kommer du n i TextChanged och flaggan INTE är satt vet du att det är användaren som matat in texten.

/j
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Nej, det fungerar inte, eftersom den enbart skall rensas när användaren gjort ändringar.
Möjligtvis att man kan kombinera det ihop med "gotfocus" och "lostfocus"
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Mer C# och WPF frågor

Inlägg av Mr Andersson »

Du skulle kunna göra någonting liknande

Kod: Markera allt

void Event_TextChanged(object sender, TextChangedEventArgs e)
{
    var ctrl = sender as Control;
    if (ctrl == null || !ctrl.IsFocused)
        return;

    // Do stuff
}
Men det kan bli problem om användaren har kontrollen som du ändrar fokuserad. Om alla ändringar beror på andra UI-events går det bra för då kan man garantera att fokus ligger på något annat men är det t.ex. en timer som gör ändringen måste du clear:a fokus manuellt först.

Alternativt avregistrera och omregistrera dina event handlers när ändringarna är färdiga, men det är lätt att man missar något event då.
Användarvisningsbild
baron3d
EF Sponsor
Inlägg: 1339
Blev medlem: 1 oktober 2005, 23:58:43
Ort: Torestorp

Re: Mer C# och WPF frågor

Inlägg av baron3d »

"Användaren kan ju faktiskt mata in samma värden"

Och ? Det är väl inget problem.
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Jo, för då är det inte systemgenererat.
mounte
Inlägg: 204
Blev medlem: 14 november 2010, 13:15:00
Ort: Sandviken

Re: Mer C# och WPF frågor

Inlägg av mounte »

Har du inte event för keydown? Bind mot det istället så fångar du bara när tangentbordet används.
https://msdn.microsoft.com/en-us/librar ... .110).aspx
Användarvisningsbild
TomasL
EF Sponsor
Inlägg: 45291
Blev medlem: 23 september 2006, 23:54:55
Ort: Borås
Kontakt:

Re: Mer C# och WPF frågor

Inlägg av TomasL »

Här kommer en ny wpf-fråga.

Jag har ett fönster där diverse olika saker görs, i vissa lägen så skall resultaten presenteras i ett annat nytt underfönster (det skall inte vara modalt, då det behöver vara större än det ursprungliga fönstret).
Data presenteras i en listView, och användaren kan då välja vilket dataset som skall användas i fortsatta beräkningar.
Dvs användaren väljer rad, och trycker på en knapp "Använd", jag skall då skicka tillbaka vilken datauppsättning användaren valt (utan att stänga fönstret) och det ursprungliga fönstret skall bli aktivt och använda resultatet för ytterligare behandling.
När användaren är nöjd, kan han stänga "result-fönstret " och fortsätta.

Jag blir inte riktigt klok på hur jag skall fånga upp data från fönster2 till fönster1.
Mr Andersson
Inlägg: 1397
Blev medlem: 29 januari 2011, 21:06:30
Ort: Lapplandet

Re: Mer C# och WPF frågor

Inlägg av Mr Andersson »

Finns säkert ett flertal sätt att göra men jag hade använt en callback.
Exempel

Kod: Markera allt

class Window1 : Window
{
    // Argumentet måste inte vara object. Du kan ha valfria typer och antal parametrar och returtyp.
    // returvärdet kan användas för att skicka tillbaka data till fönster 2.
    public delegate void Window2Callback(object data);
    ...
    // metodsignaturen måste matcha delegaten
    private void ProcessMessageFromWindow2(object data)
    {
        // gör nånting med datan som skickades in
        if(data.GetType() == typeof(String))
        {
            MessageBox.Show($"Användaren valde {data.ToString()}");
        }
    }
    ...
    private void ShowWindow2()
    {
        window2.MessageToWindow1 = ProcessMessageFromWindow2;
        window2.Show();
    }
}

Kod: Markera allt

class Window2 : Window
{
    public Window1.Window2Callback MessageToWindow1;

    private void button_Click(object sender, RoutedEventArgs e)
    {
        if(MessageToWindow1 != null)
        {
            MessageToWindow1.Invoke("hej hej");
        }
    }
}
Skriv svar