2010-03-10 1 views
1

Considérons une fenêtre avec des charges de contrôles multicolores. Je veux mettre un panneau au-dessus de ceci quand un déclencheur se produit dans la forme de sorte que tous les contrôles perdent sa couleur (tout apparaît dans l'échelle de gris) excepté le panneau qui vient de surgir. Quelqu'un peut-il m'aider avec ça ??Passage de l'arrière-plan à l'échelle des gris dans wpf

Répondre

4

J'utiliserais la propriété Effect de n'importe quelle zone de client que vous souhaitez en échelle de gris. Vous devrez cependant créer votre propre pixel shader pour effectuer la conversion en échelle de gris.

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

Vous pouvez tester rapidement votre concept en utilisant la classe BlurEffect au lieu d'un shader personnalisé.

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

Et le gestionnaire d'événements pour button3 serait tout simplement

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

Bien sûr, il est un peu plus de travail pour brancher le shader sur mesure pour la mise à l'échelle de gris, mais le bonus du pixel shader va être la performance.

+0

c'est ce que je cherchais. Toi, ton effet de flou et l'idée de micahtan de changer le zorder valent vraiment la peine d'être considérées. Merci beaucoup – sudarsanyes

1

Dans votre conteneur de niveau supérieur (grille, etc.), créez simplement un rectangle dans un ZIndex inférieur (ou créez un niveau d'imbrication supplémentaire).

Lorsque vous faites apparaître votre panneau, échangez l'index ZIndex pour le rectangle entre vos contrôles et votre panneau.

En ce qui concerne les niveaux de gris, il y a probablement quelques façons astucieuses de le faire avec un VisualBrush, mais je pense que vous pourriez aller assez loin avec un SolidColorBrush semi-opaque sur le Rectangle.

+0

merci beaucoup, votre solution semble être un bon hack – sudarsanyes

Questions connexes