Toon posts:

C#: Control Button Location werkt niet?

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo tweakenaars,

Ik ben bezig met het schrijven van een code waarbij de knop steeds op een 'random' locatie verschijnt.
Tot op heden heb ik het niet voor elkaar kunnen krijgen om deze code werkend te krijgen, wel krijg ik de
'random locatie' in de button te zien, maar kan ik de button niet naar een random locatie binnen de form verplaatsen. Het idee is in principe dat als de muis eroverheen gaat, dat de button dan automatisch naar een random locatie wordt verplaatst.

Programma:
Visual Studio 2017

Applicatie:
WPF

using System list:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;


Code: Oud
C#:
1
2
3
4
5
6
7
8
9
10
11
private void buttonRandomLoc_MouseEnter(object sender, MouseEventArgs e)
        {
            Random x = new Random();
            Point pt = new Point(int.Parse(x.Next(200).ToString()),
                int.Parse(x.Next(250).ToString()));
            buttonRandomLoc.Content = pt;
            // Zo iets als de onderstaande code heb ik nodig, 
            // maar dan krijg ik de error die ik aangegeven heb
           buttonRandomLoc.Location = pt; // <== die '.Location' werkt niet en krijg ik 
                                         // de onderstaande error
        }


Error:
Severity Code Description Project File Line Suppression State
Error CS1061 'Button' does not contain a definition for 'Location' and no extension method 'Location' accepting a first argument of type 'Button' could be found (are you missing a using directive or an assembly reference?)

Wat werkt wel?
In de button werkt de random locatie naar behoren:
Afbeeldingslocatie: https://www.mupload.nl/img/qxi2qmtsvwhhe.png

Ik dank u alvast :).

Werkende Code Update 22-03-2018 13:10 uur:
C#:
1
2
3
4
5
6
7
8
private void buttonRandomLoc_MouseEnter(object sender, MouseEventArgs e)
        {
            Random x = new Random();
            // Button kan in de hoek van de grid max op ca. 412, 280, 0, 0 
            // geplaatst worden, vandaar deze afmetingen (Left, Top, Right, Bottom)
            Thickness NewLocation = new Thickness((x.Next(412)), (x.Next(280)), (x.Next(0)), (x.Next(0)));
            buttonRandomLoc.Margin = NewLocation;
        }

[ Voor 39% gewijzigd door Verwijderd op 22-03-2018 13:14 ]

Beste antwoord (via Verwijderd op 22-03-2018 13:01)


  • Lethalis
  • Registratie: April 2002
  • Niet online
Verwijderd schreef op donderdag 22 maart 2018 @ 12:22:
[...]


Nee, in mijn situatie is het geen 'Canvas' maar 'Margin'.
Een margin is normaal gesproken een ruimte die je om een control heen vrijhoudt. Dat dit toevallig ervoor zorgt dat jij die knop kunt positioneren, betekent nog niet dat het de juiste manier is om dit te doen :P

Meestal zul je iets van een layout container hebben, dat wil zeggen een parent control dat bepaalt hoe controls worden gepositioneerd. Afhankelijk daarvan zul je de positie moeten instellen.

In jouw geval zou ik dus kiezen voor een container die absolute positionering toestaat, zoals waarschijnlijk een Canvas. Dit moet dus jouw parent control zijn waar de Button op leeft. En dan kun je de locatie zetten.

[ Voor 34% gewijzigd door Lethalis op 22-03-2018 12:27 ]

Ask yourself if you are happy and then you cease to be.

Alle reacties


Acties:
  • 0 Henk 'm!

  • Denarius
  • Registratie: Maart 2015
  • Laatst online: 03-10 14:20
Is dit met winforms of met wpf?

Edit.
Het lijkt erop dat je hier met wpf werkt, maar op de winforms manier probeert te programmeren.

Een wpf button heeft geen property location.

Is dit voor een schoolopdracht?

[ Voor 75% gewijzigd door Denarius op 22-03-2018 08:44 ]


Acties:
  • +1 Henk 'm!

  • Stinu
  • Registratie: December 2009
  • Laatst online: 29-09 07:04
Indien het WPF is:

In de designer kan je je button wel verplaatsen door te slepen.
In de XAML kan je dan makkelijk zien wat er verandert van waarden om de locatie van de button aan te passen.
Daarna kan je hetzelfde reproduceren via de code.

Acties:
  • +1 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Zou dit niet iets van Canvas.Top en Canvas.Left moeten zijn?

Ask yourself if you are happy and then you cease to be.


Acties:
  • +1 Henk 'm!

  • Aphelion
  • Registratie: Januari 2002
  • Laatst online: 09:27
Lethalis schreef op donderdag 22 maart 2018 @ 09:04:
Zou dit niet iets van Canvas.Top en Canvas.Left moeten zijn?
Precies. Afhankelijk van de container waarin de button zich bevindt. In WPF ken de button zelf geen informatie over zijn positie. Dat is niet zijn 'concern'. Hij kent 'Attached Properties' die hij krijgt van bijvoorbeeld een Canvas, of een Grid.

Aangenomen dat het een Canvas is, wil je dus ook de properties via deze control wijzigen.

code:
1
Canvas.SetLeft(buttonRandomLoc, pt.X)

[ Voor 16% gewijzigd door Aphelion op 22-03-2018 09:13 ]

Feeling lonely and content at the same time, I believe, is a rare kind of happiness


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Denarius schreef op donderdag 22 maart 2018 @ 08:32:
Is dit met winforms of met wpf?

Edit.
Is dit voor een schoolopdracht?
Ja, het is voor een school opdracht en sorry ben vergeten te vermelden dat het om een WPF Application gaat.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Stinu schreef op donderdag 22 maart 2018 @ 08:52:
Indien het WPF is:

In de designer kan je je button wel verplaatsen door te slepen.
In de XAML kan je dan makkelijk zien wat er verandert van waarden om de locatie van de button aan te passen.
Daarna kan je hetzelfde reproduceren via de code.
Ik heb gezien dat het om een 'Margin' gaat, dat bepaalt zijn locatie.
Hoe zou ik mijn code zo kunnen toepassen dat het werkt?

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Lethalis schreef op donderdag 22 maart 2018 @ 09:04:
Zou dit niet iets van Canvas.Top en Canvas.Left moeten zijn?
Nee, in mijn situatie is het geen 'Canvas' maar 'Margin'.

Acties:
  • Beste antwoord
  • +1 Henk 'm!

  • Lethalis
  • Registratie: April 2002
  • Niet online
Verwijderd schreef op donderdag 22 maart 2018 @ 12:22:
[...]


Nee, in mijn situatie is het geen 'Canvas' maar 'Margin'.
Een margin is normaal gesproken een ruimte die je om een control heen vrijhoudt. Dat dit toevallig ervoor zorgt dat jij die knop kunt positioneren, betekent nog niet dat het de juiste manier is om dit te doen :P

Meestal zul je iets van een layout container hebben, dat wil zeggen een parent control dat bepaalt hoe controls worden gepositioneerd. Afhankelijk daarvan zul je de positie moeten instellen.

In jouw geval zou ik dus kiezen voor een container die absolute positionering toestaat, zoals waarschijnlijk een Canvas. Dit moet dus jouw parent control zijn waar de Button op leeft. En dan kun je de locatie zetten.

[ Voor 34% gewijzigd door Lethalis op 22-03-2018 12:27 ]

Ask yourself if you are happy and then you cease to be.


Acties:
  • +1 Henk 'm!

  • Denarius
  • Registratie: Maart 2015
  • Laatst online: 03-10 14:20
Margin is wel de juiste property om te gebruiken.
Vervang location in margin. Kijk dan wat je mee moet geven.
Hint, het is geen point klasse maar een andere type.

Succes ermee.

Acties:
  • +1 Henk 'm!

  • Stinu
  • Registratie: December 2009
  • Laatst online: 29-09 07:04
Lethalis schreef op donderdag 22 maart 2018 @ 12:24:
[...]

Een margin is normaal gesproken een ruimte die je om een control heen vrijhoudt. Dat dit toevallig ervoor zorgt dat jij die knop kunt positioneren, betekent nog niet dat het de juiste manier is om dit te doen :P

Meestal zul je iets van een layout container hebben, dat wil zeggen een parent control dat bepaalt hoe controls worden gepositioneerd. Afhankelijk daarvan zul je de positie moeten instellen.

In jouw geval zou ik dus kiezen voor een container die absolute positionering toestaat, zoals waarschijnlijk een Canvas. Dit moet dus jouw parent control zijn waar de Button op leeft. En dan kun je de locatie zetten.
Het is inderdaad correct dat een margin eigenlijk niet de beste manier is.
Maar aangezien hij aan het leren programmeren is, is het helemaal geen slechte manier dat hij hier toch mee test om het functioneel werkende te krijgen.
En dan eventueel erna nog kan kijken hoe hij zijn programma technisch kan verbeteren.

Vroeger op school kregen wij voor dit soort "eigen inzet" meestal wel extra punten.

/edit: en als je op google zoekt naar "wpf animation move control" vind je tal van voorbeelden voor het verplaatsen binnen een canvas inclusief dat je echt de verplaatsing van de knop toont in plaats van te verdwijnen op oude locatie + verschijnen op nieuwe locatie.

[ Voor 10% gewijzigd door Stinu op 22-03-2018 12:48 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb het werkend gekregen, alhoewel naar jullie meningen het niet juist is om te doen, waardeer ik jullie antwoorden zeker :P. Ik zal proberen, nu ik de eerste stap heb gezet, de code 'technisch' te verbeteren zoals @Stinu het aangaf.

De code die ervoor zorgt dat de button op random locaties verschijnt vindt u hieronder:
C#:
1
2
3
4
5
6
7
8
private void buttonRandomLoc_MouseEnter(object sender, MouseEventArgs e)
        {
            Random x = new Random();
            // Button kan in de hoek van de grid max op ca. 412, 280, 0, 0 
            // geplaatst worden, vandaar deze afmetingen (Left, Top, Right, Bottom)
            Thickness NewLocation = new Thickness((x.Next(412)), (x.Next(280)), (x.Next(0)), (x.Next(0)));
            buttonRandomLoc.Margin = NewLocation;
        }
Pagina: 1