2011-08-31 10 views
5

Ho una casella di testo che viene aggiunta a livello di codice a un certo punto e voglio che tutto il testo abbia un effetto dropshadow, ma non lo voglio effetto applicato ai bordi della casella di testo stessa. Come faccio a fare questo? L'aggiunta di un effetto dropshadow alla casella di testo applica l'effetto ai bordi della casella e "sfoca" leggermente il testo, ma non è quello che voglio e non riesco a trovare alcuna proprietà sulla casella di testo che mi permetta di aggiungere un effetto al solo testo. Devo davvero ridimensionare la casella di testo o creare il mio modello per raggiungere questo obiettivo ??come aggiungere dropshadoweffect al solo testo di una casella di testo (programmaticamente)

Mente voi questa è una casella di testo, non un blocco di testo (in questo caso vorrei solo avere copia/incollato da here)

risposta

5

Aggiornamento: trovato un modo migliore, è possibile saltare la parte Border se si applica il Effect direttamente allo ScrollViewer che incapsula il testo nel modello.

<TextBox Text="Shadow Text"> 
    <TextBox.Resources> 
     <Style TargetType="ScrollViewer"> 
      <Setter Property="Effect"> 
       <Setter.Value> 
        <DropShadowEffect ShadowDepth="4" 
             Direction="330" 
             Color="Black" 
             Opacity="0.5" 
             BlurRadius="4"/> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </TextBox.Resources> 
</TextBox> 

Aggiornamento 2: perso la parte della creazione del TextBox nel codice. Ecco il C# equivalente al Xaml sopra

Setter effectSetter = new Setter(); 
effectSetter.Property = ScrollViewer.EffectProperty; 
effectSetter.Value = new DropShadowEffect 
{ 
    ShadowDepth = 4, 
    Direction = 330, 
    Color = Colors.Black, 
    Opacity = 0.5, 
    BlurRadius = 4 
}; 
Style dropShadowScrollViewerStyle = new Style(typeof(ScrollViewer)); 
dropShadowScrollViewerStyle.Setters.Add(effectSetter); 

TextBox dropShadowTextBox = new TextBox(); 
dropShadowTextBox.Text = "Shadow Text"; 
dropShadowTextBox.Foreground = Brushes.Teal; 
dropShadowTextBox.FontSize = 40; 
dropShadowTextBox.Margin = new Thickness(10); 
dropShadowTextBox.Resources.Add(typeof(ScrollViewer), dropShadowScrollViewerStyle); 

Buona domanda, una sola idea è quella di rendere lo sfondo e BorderBrush trasparente per la TextBox e posizionarlo in un Border

<Border BorderThickness="1" 
     BorderBrush="#FF7F9DB9" 
     SnapsToDevicePixels="True" 
     UseLayoutRounding="True" 
     Margin="10"> 
    <TextBox Text="Shadow Text" 
      Foreground="Teal" 
      FontSize="40" 
      Background="Transparent" 
      BorderBrush="Transparent"> 
     <TextBox.Effect> 
      <DropShadowEffect ShadowDepth="4" 
         Direction="330" 
         Color="Black" 
         Opacity="0.5" 
         BlurRadius="4"/> 
     </TextBox.Effect> 
    </TextBox> 
</Border> 

Ecco un confronto con un "normale" TextBox

enter image description here

+0

è xaml piuttosto che codice ma ci riuscirò, grazie per la risposta eccellente e anche per lo screenshot aggiunto – mtijn

+1

Aggiunto un approccio migliore, rimuovendo l'uso del 'Border'. Imposta l'effetto su 'ScrollViewer' nel modello –

+0

+1 per trovare una soluzione limitata all'ambito della casella di testo, eccellente! – mtijn

Problemi correlati