Используйте Canvas для маскировки другого холста в C # / WPF - PullRequest
4 голосов
/ 20 мая 2009

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

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

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

Заранее спасибо!

РЕДАКТИРОВАТЬ: Если бы вместо холста я мог бы использовать что-то вроде прямоугольника (как только его можно изменить размер), это тоже хорошо!

РЕДАКТИРОВАТЬ 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;

Ответы [ 2 ]

3 голосов
/ 20 мая 2009

Возможно, вы хотите использовать OpacityMask свойство на вашем 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" ... /> 

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

1 голос
/ 20 мая 2009

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

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

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

...