使用UIElement作为WPF中的剪辑

使用UIElement作为WPF中的剪辑,wpf,opacity,clip,uielement,Wpf,Opacity,Clip,Uielement,请原谅我的无知——我对WPF很陌生 我希望在我的应用程序中实现一个微小的视觉效果,使其看起来像“内部”圆角。该窗口有一个暗边框,封装了几个UIElement,其中一个是位于窗口底部的状态栏。此状态栏具有与窗口边框匹配的深色背景。在状态栏上方是一个内容视图,它当前是一个网格-它的背景是半透明的(我认为这是一个限制-您可以通过下面的桌面查看内容视图)。我希望内容视图(由下图中透明的内部区域表示)具有圆角的外观,尽管我希望必须自己创建一种错觉 (无法发布图像,因为我是一个潜伏者而不是海报- 我的第一种

请原谅我的无知——我对WPF很陌生

我希望在我的应用程序中实现一个微小的视觉效果,使其看起来像“内部”圆角。该窗口有一个暗边框,封装了几个UIElement,其中一个是位于窗口底部的状态栏。此状态栏具有与窗口边框匹配的深色背景。在状态栏上方是一个内容视图,它当前是一个网格-它的背景是半透明的(我认为这是一个限制-您可以通过下面的桌面查看内容视图)。我希望内容视图(由下图中透明的内部区域表示)具有圆角的外观,尽管我希望必须自己创建一种错觉

(无法发布图像,因为我是一个潜伏者而不是海报-

我的第一种方法是在状态栏的正上方添加一个矩形(填充与边框相同的深色),并将一个带有圆角的边框指定给其不透明掩码(类似于Chris Cavanagh**提出的解决方案)。可悲的是,所产生的效果与我试图达到的效果恰恰相反

我知道Clip属性在这种情况下很有用,但在我看来,使用任何类型的几何体都是不够的,因为它不会根据它所在的区域动态调整大小

编辑:包括我的XAML:

<Grid Background="{StaticResource ClientBg}" Tag="{Binding OverlayVisible}" Style="{StaticResource mainGridStyle}">

        <DockPanel LastChildFill="True">

            <!-- Translates to a StackPanel with a Menu and a Button -->
            <local:FileMenuView DockPanel.Dock="Top" />

            <!-- Translates to a StatusBar -->
            <local:StatusView DockPanel.Dock="Bottom" />

            <!-- Translates to a Grid -->
            <local:ContentView />

        </DockPanel>

    </Grid>

任何指点都是非常受欢迎的-我准备在必要时提供更深入的细节


**
http://www.dotnetkicks.com/wpf/WPF_easy_rounded_corners_for_anything

编辑:现在我明白你的意思了。事实上,您可以使用Path+OpacityMask方法。您必须绘制“反转”路径,才能将其用作不透明度遮罩。但我为您提供了更简单、更快的解决方案:)。使用Border+CornerRadius,并用实心路径填充间隙。只需在Kaxaml中尝试以下代码,并让我知道这是否是您想要的:

<Window
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   Width="240"
   Height="320"
   AllowsTransparency="True"
   Background="Transparent"
   WindowStyle="None">
   <Grid>
      <Grid.RowDefinitions>
         <RowDefinition Height="24"/>
         <RowDefinition Height="*"/>
         <RowDefinition Height="24"/>
      </Grid.RowDefinitions>
      <Border Background="Black"/>
      <Border Grid.Row="1" BorderBrush="Black" BorderThickness="5">
         <Grid>
            <Border Background="White" CornerRadius="0, 0, 5, 5" Opacity="0.7"/>
            <Path
               Width="15"
               Height="15"
               HorizontalAlignment="Left"
               VerticalAlignment="Bottom"
               Data="M10,10 L5,10 L5,5 C4.999,8.343 6.656,10 10,10 z"
               Fill="Black"
               Stretch="Fill"/>
            <Path
               Width="15"
               Height="15"
               HorizontalAlignment="Right"
               VerticalAlignment="Bottom"
               Data="M10,10 L5,10 L5,5 C4.999,8.343 6.656,10 10,10 z"
               Fill="Black"
               Stretch="Fill">
               <Path.RenderTransform>
                  <TransformGroup>
                     <ScaleTransform ScaleX="-1"/>
                     <TranslateTransform X="15"/>
                  </TransformGroup>
               </Path.RenderTransform>
            </Path>
         </Grid>
      </Border>
      <Border Grid.Row="2" Background="Black"/>
   </Grid>
</Window>


PS:您可以通过避免渲染变换来简化此解决方案,但您已经想到了。

感谢您的回答-您的回答是正确的,只是桌面本身可以通过内容区域的半透明背景看到。这在我的问题中并不清楚;我更新了它以反映这一点。