将 DropShadowEffect 应用于 WPF 文本框文本

Apply DropShadowEffect to WPF Textbox text

如何将 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 文本)

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

通过自定义你的TextBoxControlTemplate,你可以达到想要的效果:

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

相反,您可能希望从文本框中删除边框、背景和焦点矩形,这样您仍然具有文本框功能:

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