Laden...

TextBox mit runden Ecken im Resourcenwörterbuch erstellen

Letzter Beitrag vor 15 Jahren 9 Posts 4.741 Views
TextBox mit runden Ecken im Resourcenwörterbuch erstellen

hallo forum,

mein resourcenwörterbuch hab ich nun zum laufen bekommen.

der nächste schritt den ich gern machen würde, wäre ein style für die textbox zu erstellen..

und zwar soll die dann runde ecken haben.. und je nachdem ob der focus vorhanden ist, soll sich die border einfärben..

ich habe beispiele gefunden, die aber mit einem textblock arbeiten.. der textblock ist aber nicht das was ich brauche...

<Style TargetType="TextBox">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">
          <Grid>
            <Rectangle Fill="White" 
                       RadiusX="7" RadiusY="7"
                       Stroke="Gray" StrokeThickness="2"/>
            <TextBlock HorizontalAlignment="Center"
                       VerticalAlignment="Center" FontFamily="Tahoma" 
                       FontSize="{TemplateBinding Property=FontSize}">
              <ContentPresenter Content="{TemplateBinding Property=Text}" />
            </TextBlock>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
    <Style.Triggers>
      <Trigger Property="Control.IsMouseOver" Value="True">
        <Setter Property="Control.FontSize">
          <Setter.Value>
            20
          </Setter.Value>
        </Setter>
      </Trigger>
    </Style.Triggers>
  </Style>

dies ist ein beispiel für was ähnliches.. aber leider mit einem textblock..

da ich ein neuling hier drin bin, hab ich nicht so die ahnung.. kann man das auch für eine textbox machen?
der tausch von textblock zu textbox führt nämlich zu nem fehler..

<Border CornerRadius="4">
    <TextBox BorderThickness="0" />
</Border>

feddich

so was ähnliches habe ich auch versucht

aber wenn ich das als style verwenden möchte kann ich ja in

<Style TargetType="TextBox">
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">

nicht wieder

textbox reinbringen..
das führt doch zu einer unendl schleife in der dekleartion schon selbst???
auch laut aussage des designers..

geht das nicht, dass ich mehreren textboxes einen style zuweisen kann mit runden ecken und dass ich dort drinnen auch text eingeben kann?

hab grad n brett vorm kopf..

Siehst du in meinem Post irgendwo ein Style? 😛
Die Idee war nicht die TextBox zu Stylen, sondern ein Border drum herum 😄

Wenn du unbedingt ein Style haben willst, mach sowas:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="{x:Type TextBox}">
            <Border CornerRadius="4" Padding="2" Background="White" BorderBrush="Pink" BorderThickness="1">
                <ScrollViewer Margin="0" x:Name="PART_ContentHost" />
            </Border>
        </ControlTemplate>
    </Setter.Value>
</Setter>

daher mein einwand g

es funktioniert. ich danke dir fürs erste!

wenn ich noch eine frage stellen könnte...;)

ich hab versucht den style ein wenig auszubauen, um eine animation..
wenn die textbox nun den focus bekommt, soll der rahmen um sie sichtbar gemacht werden...und umgekehrt...

mein geistiger erguß sieht so aus und funktioniert nicht..

<Style TargetType="TextBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Border CornerRadius="4" Name="bord" Padding="2" Background="LightYellow" BorderBrush="DarkBlue" BorderThickness="0">
                        <ScrollViewer
                            Margin="0"
                            Background="LightYellow"
                            FontFamily="Arial"
                            FontSize="11"
                            x:Name="PART_ContentHost" />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="GotFocus" >
                <BeginStoryboard >
                    <Storyboard >
                        <ThicknessAnimation 
                            From="0" To="2"
                            Storyboard.TargetProperty="BorderThickness"
                            Duration="0:0:10"
                            AutoReverse="False"
                            BeginTime="0:0:3">                            
                        </ThicknessAnimation>
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>            
        </Style.Triggers>
    </Style>

Ich würde vorschlagen erst einmal zu Testen ob GotFocus überhaupt aufgerufen wird.
Schnapp dir eine TextBox in einem Fenster, und aboniere dort das Event und schau mal ob es aufgerufen wird.

so...
das ereignis hab ich getestet.. es wird ausgelöst..
ich habe den style noch folgendermaßen verändert (storyboard hat targetname bekommen), nun wirft er aber während der ausführung eine exception und sagt dass ich nem storyboard kein targename in nem style zuweisen kann...

<Style TargetType="TextBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TextBox}">
                    <Grid>
                        <Border CornerRadius="4" x:Name="Border" Padding="2" Background="LightYellow" BorderBrush="DarkBlue" BorderThickness="0">
                            <ScrollViewer
                                Margin="0" 
                                Content="{TemplateBinding Property=ContentControl.Content}"
                                Background="LightYellow"
                                FontFamily="Arial"
                                FontSize="11"
                                x:Name="PART_ContentHost" />
                        </Border>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="TextBox.GotFocus" >
                <EventTrigger.Actions>
                    <BeginStoryboard >
                        <Storyboard >                        
                            <ThicknessAnimation 
                                From="0" To="2"
                                Storyboard.TargetName="Border"
                                Storyboard.TargetProperty="BorderThickness"
                                Duration="0:0:10"
                                AutoReverse="False"
                                BeginTime="0:0:3">                            
                            </ThicknessAnimation>
                        </Storyboard>
                    </BeginStoryboard>
                </EventTrigger.Actions>
            </EventTrigger>            
        </Style.Triggers>
    </Style>

Ok, Klassischer Fall von Sichtbarkeit.
Du kannst nicht im Trigger eines Styles auf eine Komponente im Template verweisen, Wenn du das Template durch ein Trigger verändern willst, kannst du das nur im ControlTemplate.Triggers machen.
In den Triggers für das Style kannst du nur die Properties der TextBox ändern.

hmm ok..

wenn das nun nicht geht, kann man das irgendwie anders umsetzen?

denn im template kann ich auf gotFocus ja nicht verweisen, wenn ich mich nicht täusche...?