2009-05-20 6 views
4

J'apprends du WPF/C# donc cette question peut être stupide pour certains d'entre vous mais je ne trouve pas la solution. J'ai un Canevas (disons qu'il compte les textes) et ensuite j'ai un autre Canevas que je veux utiliser comme masque (tout ce qui est dans ce second Canvas masquera le premier).Utilisez Canvas pour masquer un autre canevas en C#/WPF

Comment puis-je faire cela? Que faire si le second Canvas est en mouvement? Je veux changer l'échelle de la deuxième toile (masque) afin qu'elle "dévoile" le contenu du premier (contenu).

Merci d'avance!

EDIT: Si au lieu d'un canevas je pourrais utiliser quelque chose comme un rectangle (dès qu'il est redimensionnable) c'est bien aussi!

EDIT 2: Voici le code que je utilise:

// Order info 
Canvas order_info = new Canvas(); 
order_info.Width = 220; 
order_info.Height = 250; 
order_info.Background = Brushes.Yellow; 
user_info.Children.Add(order_info); 
// Order info mask 
Canvas order_info_mask = new Canvas(); 
order_info_mask.Width = 110; 
order_info_mask.Height = 250; 
order_info_mask.Background = Brushes.Pink; 
user_info.Children.Add(order_info_mask); 
// Apply mask 
VisualBrush mask_brush = new VisualBrush(); 
mask_brush.Visual = order_info_mask; 
order_info.OpacityMask = mask_brush; 

Répondre

3

Vous voulez probabbly utiliser le OpacityMask property sur votre place Canvas, qui est de type Brush, ce qui pourrait être animé.

Modifier en réponse à la question: Vous pouvez faire quelque chose comme:

VisualBrush b = new VisualBrush(); 
b.Visual = canvas2; 
canvas2.OpacityMask = b; 

Vous pouvez également définir ce en XAML avec databinding:

<Canvas> 
    <Canvas.OpacityMask> 
     <VisualBrush Visual="{Binding ElementName=canvas2}" /> 
    </Canvas.OpacityMask> 
</Canvas> 

... 

<Canvas x:Name="canvas2" ... /> 

Cependant, pour moi, cela semble l'approche incorrecte, quelle transition visuelle êtes-vous exactement?

+0

merci. très utile. –

1

esprit, je ne suis pas expert en WPF, mais vous devez commencer par intégrer deux toiles dans une grille 1x1:

<Grid> 
    <Canvas x:Name="background"> 
    </Canvas> 
    <Canvas x:Name="foreground"> 
    </Canvas> 
</Grid> 

De cette manière, le contenu des toiles sera dessiné au-dessus de l'autre. A l'intérieur de la toile de premier plan, vous pouvez dessiner vos rectangles, etc. J'espère que cela vous aidera à démarrer!

+0

Merci pour la suggestion mais ce n'est pas exactement ce que je cherche. Je ne veux pas "couvrir" une div avec une autre mais montrer seulement une partie de celle-ci (alors que vous pouvez toujours voir l'arrière-plan et tout.) Donc, un masque est ce dont j'ai besoin Merci! – ozke