Как применить эффект к границе, но не к ее содержимому в WPF?
Вопрос
У меня есть приложение 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>
Решение
По ссылке с 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>
Другие советы
Одно простое (взломать?) решение — сделать
<StackPanel Background="White">
Это должно решить проблему с текстом с тенью (хотя не уверен насчет проблемы с производительностью).Проблема в том, что WPF применяет эффекты к элементу set и всем его дочерним элементам в визуальном дереве.Эта ссылка объясняет это лучше:Проблема с производительностью DropShadowEffect
Попробуйте следующий блок (или аналогичный) для всех TextBlocks:
<TextBlock>
<TextBlock.Effect>
<DropShadowEffect BlurRadius="30" ShadowDepth="5" Color="White"/>
</TextBlock.Effect>
</TextBlock>