将DropShadowEffect应用于WPF文本框文本

时间:2018-08-25 12:38:49

标签: c# wpf xaml pixel-shader

如何将DropShadowEffect应用于TextBox的内容,而不是围绕TextBox本身?我希望文本具有与将DropShadowEffect应用于TextBlock相同的效果。

<TextBox>
    <TextBox.Effect>
    <DropShadowEffect ShadowDepth="4"
                      Direction="330"
                      Color="Black"
                      Opacity="0.5"
                      BlurRadius="4"/>
    </TextBox.Effect>
</TextBox>

^这会在整个盒子周围产生阴影。

<TextBlock>
    <TextBlock.Effect>
    <DropShadowEffect ShadowDepth="4"
                      Direction="330"
                      Color="Black"
                      Opacity="0.5"
                      BlurRadius="4"/>
    </TextBlock.Effect>
</TextBlock>

^这是所需的外观。 (但对于TextBox文本)

编辑:带回家的消息是,将着色器应用于控件的每个渲染像素。如果您只想将其应用于部分模板,请在该模板上的该级别上应用它,或者不渲染其他所有内容。

2 个答案:

答案 0 :(得分:1)

通过自定义ControlTemplate中的TextBox,您可以达到所需的效果:

<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="TextBox">
            <Grid x:Name="RootElement">
                <!-- Use your effects on the ContentPresenter here. -->
                <ContentPresenter Content="{TemplateBinding Padding}"/>
            </Grid>
        </ControlTemplate>
    </Setter.Value>
</Setter>

答案 1 :(得分:1)

相反,您可能想从文本框中删除“边框”,“背景”和“焦点”矩形,以便仍然具有“文本框”功能:

<TextBox Background="Transparent"
         BorderBrush="Transparent"
         BorderThickness="0"
         TextWrapping="Wrap">
    <TextBox.Effect>
        <DropShadowEffect ShadowDepth="4"
                          Direction="330"
                          Color="Black"
                          Opacity="0.5"
                          BlurRadius="4"
                           />
    </TextBox.Effect>
    <TextBox.FocusVisualStyle>
        <Style>
            <Setter Property="Control.Template">
                <Setter.Value>
                    <ControlTemplate/>
                </Setter.Value>
            </Setter>
        </Style>
    </TextBox.FocusVisualStyle>
</TextBox>