Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[WPF] TextBox in RadioButton content - click event doorgeven

Pagina: 1
Acties:

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Ik zit al een uur te prutsen aan iets wat volgens mij extreem simpel is, maar ik kom er maar niet uit...

Ik heb een RadioButton in WPF waarvan ik in de Content (onder andere) een TextBox heb. Het idee is dat er twee van deze componenten naast elkaar staan waar de gebruiker iets moet invullen, de linker is in een eenheid en de rechter in een andere eenheid; invullen van de ene zorgt dan dat de andere berekend wordt, en met de radiobutton wordt aangegeven welke de gebruiker momenteel kan veranderen.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
<RadioButton>
    <StackPanel>
        <TextBlock Text="Eenheid 1" />
        <TextBox Text="{Binding Eenheid1}" />
    </StackPanel>
</RadioButton>

<RadioButton>
    <StackPanel>
        <TextBlock Text="Eenheid 2" />
        <TextBox Text="{Binding Eenheid2}" />
    </StackPanel>
</RadioButton>


Ik wil gewoon dat de radiobutton 'actief' wordt (IsChecked = true) wanneer de gebruiker in de textbox klikt. Liefst ook als hij met Tab naar de textbox gaat, dus zodra de textbox focus krijgt, maar dat maakt voor het probleem niet zo uit denk ik.

Ik krijg dit echter niet voor elkaar... Het probleem is dat de TextBox alle muis events 'opslikt' en ze niet meer doorspeelt naar 'boven' (naar de stackpanel en dan naar de RadioButton). Ik snap hoe dit werkt, ik snap alleen niet hoe ik dit tegen ga. Het omgekeerde is simpel: als ik een muis event wil stoppen bij een bepaald niveau dan zorg ik dat daar de Handled property van de RoutedEventArgs op true gaat, en dan gaat hij niet verder door naar boven. Maar ik wil het omgekeerde. Dus ik zet de Handled property of false, maar dat lijkt geen effect te hebben (ik denk dat de textbox dat intern weer terug zet).

Zit ik er gewoon compleet verkeerd tegenaan te kijken? 8)7

Mijn iRacing profiel


  • epic007
  • Registratie: Februari 2004
  • Laatst online: 17-11 15:31
Je kan het IsHitTestVisible op false zetten op je StackPanel, alleen dan krijgt je TextBox ook helemaal geen mouseevents meer.

Kijk ook hier: http://msdn.microsoft.com/en-us/library/ms752097.aspx

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Ik snap niet wat ik daar mee opschiet. Dan kan ik de radiobutton dus helemaal niet meer 'checken'?

Ik wil juist dat de radiobutton gechecked wordt als ik ergens in zijn content klik. Zijn content is een stackpanel met een textblock en een textbox. Als ik ergens in de stackpanel of op de textblock klik dan wordt de radiobutton gechecked zoals ik wil (klein detail: de background van de stackpanel is Transparent en niet null zodat ik er op kan klikken), maar als ik in de textbox klik dan gebeurt dat niet, waarschijnlijk omdat die klik afgehandeld wordt en niet meer naar boven naar de stackpanel en dan radiobutton propageert.

Mijn enige vraag is: hoe zorg ik dat de klik omhoog 'bubbelt' naar de radiobutton en niet meer door de textbox afgehandeld wordt? De textbox moet verder wel gewoon blijven functioneren, als ik er in klik moet ik er dus in kunnen typen zoals normaal, maar OOK moet de radiobutton gechecked worden.

Mijn iRacing profiel


  • epic007
  • Registratie: Februari 2004
  • Laatst online: 17-11 15:31
IsHitTestVisible=false moet je ook op de StackPanel zetten, niet op je RadioButton. Dan werkt het ken 'checken' gewoon goed (bij mij zelfs met een transparante radiobutton). Je textbox reageert nu alleen niet meer op de muis.

XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
            <RadioButton Margin="2">
                <StackPanel IsHitTestVisible="False" Orientation="Horizontal" Margin="10">
                    <TextBlock Text="Eenheid 1" />
                    <TextBox x:Name="tb1" Text="" Width="100" Margin="20,0,0,0"/>
                </StackPanel>
            </RadioButton>

            <RadioButton Margin="2">
                <StackPanel IsHitTestVisible="False" Orientation="Horizontal" Margin="10">
                    <TextBlock Text="Eenheid 2" />
                    <TextBox x:Name="tb2"  Text="" Width="100" Margin="20,0,0,0"/>
                </StackPanel>
            </RadioButton>

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Ah, dat had ik dan niet goed begrepen.

Maar in ieder geval werkt dat niet voor me want ik kan nu de textbox niet meer gebruiken (tenzij ik met tab er naartoe loop).

Mijn iRacing profiel


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Als ik een custom textbox maak waar ik in het MouseDown event de Handled property of false zet dan kom ik een stapje verder:
C#:
1
2
3
4
5
6
7
8
    public class CustomTextbox : TextBox
    {
        protected override void OnMouseDown(MouseButtonEventArgs e)
        {
            base.OnMouseDown(e);
            e.Handled = false;
        }
    }


Een klik op de textbox zorgt nu dat het event door bubbelt en de RadioButton gechecked wordt. Helaas is dit 'not done' omdat de control dan niet meer werkt...

http://msdn.microsoft.com...ows.controls.textbox.aspx
[quote=msdn]Do not mark the event handled unless you deliberately want to disable TextBox native handling of these events, and be aware that this has notable effects on the control's UI.[/quote]

Ik kan op deze manier ook niet typen in de textbox, geen tekst selecteren, etc. Dus dat werkt ook niet...


Hmm dat is ook niet logisch, ik zet hem juist niet op handled, en toch stopt de native handling?

[ Voor 6% gewijzigd door NickThissen op 03-06-2014 16:18 ]

Mijn iRacing profiel


  • epic007
  • Registratie: Februari 2004
  • Laatst online: 17-11 15:31
Wat je misschien zou kunnen doen is op het Checked event de IsHitTestVisible weer true zetten en je textbox expliciet focus geven dmv:

textbox.Focus();

De focus via de tabtoets zou je ook kunnen afvangen dmv het GotFocus event, hier zou je de bijbehorende checkbox kunnen checken.

  • Vishari Beduk
  • Registratie: Februari 2009
  • Laatst online: 21-11 23:11

Vishari Beduk

loves f/1.8 primes

Je kan het ook anders oplossen door een 'KeyDown' event handler toe te voegen aan de TextBox.
En in die event handler dit zetten: RadioButton.IsChecked = true;

En als je dat wat netter wilt doen dan maak je een user control waar dit in zit.

weet het niet meer

Pagina: 1