Как применить эффект к границе, но не к ее содержимому в WPF? - PullRequest
9 голосов
/ 30 апреля 2009

У меня есть приложение WPF, у которого есть сторонняя сетка данных с рамкой вокруг нее. Я использовал DropShadowEffect, чтобы поместить тень за границу, но это, кажется, несколько влияет на производительность (не так сильно, как BitmapEffect, но все же заметно) и делает рендеринг шрифтов размытым. Есть ли способ как-то применить эффект к границе, но не к ее содержимому?

Я пытался установить Эффект для содержимого на {x:Null}, но это не помогло.

Вот пример приложения, которое я придумал. Он ставит тень за границей, но также ставит тень за каждой строкой текста. Я хочу тень за границей, но не текст.

<Window x:Class="WpfEffectTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="10" CornerRadius="5" Margin="25">
            <Border.Effect>
                <DropShadowEffect BlurRadius="10" ShadowDepth="5" />
            </Border.Effect>
            <StackPanel>
                <TextBlock>This is some text</TextBlock>
                <TextBlock>This is some text</TextBlock>
                <TextBlock>This is some text</TextBlock>
                <TextBlock>This is some text</TextBlock>
                <TextBlock>This is some text</TextBlock>
                <TextBlock>This is some text</TextBlock>
            </StackPanel>
        </Border>

    </Grid>
</Window>

Ответы [ 3 ]

12 голосов
/ 30 апреля 2009

Ссылка от gcores имеет ответ, который состоит в том, чтобы поместить границу и ее содержимое в одну сетку, чтобы содержимое перекрывало границу.

<Window x:Class="WpfEffectTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
        <Border BorderBrush="Black" BorderThickness="10" CornerRadius="5" Margin="25">
            <Border.Effect>
                <DropShadowEffect BlurRadius="10" ShadowDepth="5" />
            </Border.Effect>
        </Border>
        <StackPanel Margin="35">
            <TextBlock>This is some text</TextBlock>
            <TextBlock>This is some text</TextBlock>
            <TextBlock>This is some text</TextBlock>
            <TextBlock>This is some text</TextBlock>
            <TextBlock>This is some text</TextBlock>
            <TextBlock>This is some text</TextBlock>
        </StackPanel>
    </Grid>
</Window>
4 голосов
/ 30 апреля 2009

Одно простое (хак?) Решение - сделать

<StackPanel Background="White">

Это должно решить текст с проблемой с тенями (хотя не уверен насчет проблемы с производительностью). Проблема в том, что WPF применяет эффекты к элементу set и всем его дочерним элементам в визуальном дереве. Эта ссылка объясняет это лучше: Проблема производительности DropShadowEffect

0 голосов
/ 27 мая 2016

Попробуйте следующий блок (или аналогичный) для всех текстовых блоков:

<TextBlock>
    <TextBlock.Effect>
        <DropShadowEffect BlurRadius="30" ShadowDepth="5" Color="White"/>
    </TextBlock.Effect>
</TextBlock>
...