2009-05-20 3 views
4

Я изучаю некоторые WPF/C#, поэтому этот вопрос может быть глупым для некоторых из вас, но я не могу найти решение.Использование Canvas для маскировки другого холста в C#/WPF

У меня есть холст (скажем, он содержит тексты), а затем у меня есть другой холст, который я хочу использовать в качестве маски (что-нибудь на этом втором холсте замаскирует первый).

Как я могу это сделать? Что делать, если второй холст движется? Я хочу изменить масштаб второго холста (маски), чтобы он «раскрывал» содержимое первого (контента).

Заранее благодарен!

EDIT: Если вместо холста я мог бы использовать что-то вроде прямоугольника (как только это изменится), это тоже хорошо!

EDIT 2: Вот код, я использую:

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

ответ

3

Вы probabbly хотите использовать OpacityMask property на вашем Canvas вместо этого, который имеет тип Brush, который может быть анимированной.

Редактировать в ответ на вопрос: Вы можете сделать что-то вроде:

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

Вы также можете установить это в XAML с привязкой данных:

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

... 

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

Однако, мне это кажется неправильный подход, какой визуальный переход вы в точности?

+0

спасибо. очень полезно. –

1

разума, я не эксперт WPF, но вы должны начать с встраиванием двух полотен в 1x1 сетке:

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

Таким образом, содержание полотен будет обращено друг на друг. На переднем плане холста вы можете нарисовать свои прямоугольники и т. Д. Надеюсь, это поможет вам начать!

+0

Спасибо за предложение, но это не совсем то, что я ищу. Я не хочу «прикрывать» один div другим, но показывать только его часть (пока вы все еще можете видеть фон и все такое. Поэтому маска - это то, что мне нужно. Спасибо! – ozke

Смежные вопросы