【问题标题】:Use Canvas to mask another canvas in C#/WPF在 C#/WPF 中使用 Canvas 遮盖另一个画布
【发布时间】:2010-10-27 12:16:19
【问题描述】:

我正在学习一些 WPF/C#,所以这个问题对你们中的一些人来说可能很愚蠢,但我找不到解决方案。

我有一个 Canvas(假设它包含文本),然后我有另一个 Canvas 想用作蒙版(第二个 Canvas 中的任何内容都会掩盖第一个)。

我该怎么做? 如果第二个 Canvas 正在移动怎么办?我想更改第二个画布(蒙版)的比例,以便“揭示”第一个画布(内容)的内容。

提前致谢!

编辑:如果我可以使用矩形之类的东西代替画布(只要它可以调整大小),那也很好!

编辑 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;

【问题讨论】:

    标签: c# wpf canvas mask


    【解决方案1】:

    请注意,我不是 WPF 专家,但您应该从在 1x1 网格中嵌入两个画布开始:

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

    这样,画布的内容将被绘制在彼此之上。在前景画布内,您可以绘制矩形等。希望这有助于您开始!

    【讨论】:

    • 感谢您的建议,但这并不是我想要的。我不想用另一个“覆盖”一个 div,但只显示它的一部分(虽然你仍然可以看到背景和所有内容。所以我需要一个面具。不过谢谢!
    【解决方案2】:

    您可能想在您的Canvas 上使用OpacityMask property,它是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" ... /> 
    

    但是,对我来说,这似乎是错误的方法,你到底是什么视觉过渡?

    【讨论】:

      猜你喜欢
      • 2015-08-12
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 2011-04-27
      • 1970-01-01
      • 1970-01-01
      • 2013-11-14
      • 2010-12-12
      相关资源
      最近更新 更多