2011-08-31 24 views
5

Tengo un cuadro de texto que se agrega programáticamente a un lienzo en algún momento y quiero que todo el texto tenga un efecto dropshado, pero no quiero eso efecto aplicado a los bordes del cuadro de texto en sí. ¿Cómo hago esto? Agregar un efecto dropshado al cuadro de texto aplica el efecto a los bordes del cuadro y "difumina" un poco el texto, pero eso no es lo que quiero y no puedo encontrar ninguna propiedad en el cuadro de texto que me permita agregar un efecto al texto solo. ¿Realmente tengo que volver a diseñar el cuadro de texto o crear mi propia plantilla para lograr esto?cómo agregar dropshadoweffect solo al texto de un cuadro de texto (mediante programación)

mente que este es un cuadro de texto, no un bloque de texto (en cuyo caso sólo tendría copiar/pegar de here)

Respuesta

5

Actualización: encontrado una mejor manera, se puede omitir la parte Border si se aplica el Effect directamente al ScrollViewer que encapsula el texto en la Plantilla.

<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> 

Actualización 2: se perdió la parte de la creación del TextBox en el código. Aquí está el C# equivalente a la Xaml anterior

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); 

Buena pregunta, una idea es hacer el fondo y BorderBrush transparente para el TextBox y colocarlo en 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> 

Aquí está una comparación con una "normal" TextBox

enter image description here

+0

que es xaml en lugar de código pero lo administraré, gracias por la excelente respuesta y también por la captura de pantalla adicional – mtijn

+1

Se agregó un mejor enfoque, eliminando el uso del 'Border'. Establezca el efecto en el 'ScrollViewer' en la plantilla –

+0

+1 para encontrar una solución limitada al alcance del cuadro de texto, ¡excelente! – mtijn

Cuestiones relacionadas