Применить DropShadowEffect к текстовому окну WPF - PullRequest
0 голосов
/ 25 августа 2018

Как я могу применить 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 голосов
/ 25 августа 2018

Вместо этого вы можете удалить прямоугольник «Граница», «Фон» и «Фокус» из текстового поля, чтобы у вас все еще была функция TextBox:

<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>
0 голосов
/ 25 августа 2018

Настраивая 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>
...