Превращение фона в оттенки серого в wpf - PullRequest
1 голос
/ 10 марта 2010

Рассмотрим окно с множеством разноцветных элементов управления. Я хочу поместить панель поверх этого, когда какой-то триггер происходит в такой форме, что все элементы управления теряют свой цвет (все отображается в оттенках серого), кроме панели, которая только что появилась. Может ли кто-нибудь помочь мне с этим ??

Ответы [ 2 ]

4 голосов
/ 10 марта 2010

Я бы использовал свойство Effect любой клиентской области, которую вы хотите серого. Однако вам потребуется создать свой собственный пиксельный шейдер для преобразования оттенков серого.

http://windowsclient.net/wpf/wpf35/wpf-35sp1-more-effects.aspx

Вы можете быстро проверить свою концепцию, используя класс BlurEffect вместо пользовательского шейдера.

<Window x:Class="WpfGrayscaleSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Height="327" Width="526">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="239*" />
        <RowDefinition Height="50*" />
    </Grid.RowDefinitions>

    <Canvas Name="clientArea" Background="Transparent" Grid.Row="0">
        <!-- Just some controls -->
        <Button Height="31" Name="button1" Width="80" Canvas.Left="30" Canvas.Top="125">Button</Button>
        <Button Height="28" Name="button2" VerticalAlignment="Bottom" Click="button2_Click" HorizontalAlignment="Right" Width="75" Margin="0,0,16,34" Canvas.Left="66" Canvas.Top="54">Button</Button>
        <Rectangle Margin="86,43,0,0" Name="rectangle1" Stroke="Black" Fill="Crimson" Height="59" HorizontalAlignment="Left" VerticalAlignment="Top" Width="109" Canvas.Left="145" Canvas.Top="44" />
    </Canvas>

    <!-- Button to activate the shader effect -->
    <Button Height="23" Margin="15,0,0,21" Name="button3" VerticalAlignment="Bottom" HorizontalAlignment="Left" Width="75" Grid.Row="1" Click="button3_Click">Button</Button>
</Grid>

И обработчик события для button3 будет просто

 private void button3_Click(object sender, RoutedEventArgs e)
 {
     clientArea.Effect = new BlurEffect() { Radius = 10.0 };
 }

Конечно, немного сложнее подключить пользовательский шейдер для масштабирования серого, но дополнительным бонусом пиксельного шейдера будет производительность.

1 голос
/ 10 марта 2010

В вашем контейнере верхнего уровня (Grid и т. Д.) Просто создайте прямоугольник в нижнем ZIndex (или создайте еще один уровень вложенности).

Когда вы поднимаете панель вверх, поменяйте местами ZIndex для прямоугольника, чтобы он располагался между вашими элементами управления и панелью.

Что касается оттенков серого, то, вероятно, есть несколько изящных способов сделать это с помощью VisualBrush, но я думаю, что вы могли бы довольно далеко продвинуться с полупрозрачным SolidColorBrush на прямоугольнике.

...