C# 创建覆盖除特定区域外的整个区域的控件

C# 创建覆盖除特定区域外的整个区域的控件,c#,xaml,uwp,win-universal-app,C#,Xaml,Uwp,Win Universal App,我想创建一个控件,该控件覆盖除特定区域外的整个区域。该特定区域将为椭圆形/矩形。类似于下面的概念 我的想法是使用路径。下面是我的路径代码 <Path Name="ShowcasePath" StrokeThickness="1" IsHitTestVisible="True"> <Path.Data> <GeometryGroup> <EllipseGeometry RadiusX="100" Radiu

我想创建一个控件,该控件覆盖除特定区域外的整个区域。该特定区域将为椭圆形/矩形。类似于下面的概念

我的想法是使用路径。下面是我的路径代码

<Path Name="ShowcasePath" StrokeThickness="1" IsHitTestVisible="True">
    <Path.Data>
        <GeometryGroup>
            <EllipseGeometry RadiusX="100" RadiusY="50"/>
            <RectangleGeometry/>
        </GeometryGroup>
    </Path.Data>
</Path>

EllipseGeometry的
center
RectangleGeometry的
Rect
将在代码隐藏中设置

这种方法有两个问题

  • 填充颜色是半透明的,即使没有alpha值。最终颜色为透明白色。所以这不是一个真正的问题
  • 椭圆内的项目应为全功能项目,椭圆外的项目应为非功能项目
  • 有没有解决上述问题的办法


    或者对该控件有什么不同的想法?

    您不需要尝试获取“点击”的元素,只需将该元素(在您的情况下是togglebutton)带到前面(基本上高于所有其他元素,以便可以点击)。 您可以通过以下任一方法执行此操作:

  • 更改元素的zindex属性,使其位于前面。
    YourElement.SetValue(Canvas.ZIndexProperty,index)
  • 删除该元素并再次将其添加到父网格(因此它基本上是最后一个要添加的元素)

    parentGrid.Children.Remove(YourElement);
    parentGrid.Children.Add(YourElement);
    parentGrid.UpdateLayout()


  • 用户成功与控件交互后,可以将其切换回以前的方式。。希望这能有所帮助。

    我想你的例子已经非常接近了,至少我没有发现任何错误。如果您尝试以下代码,您将看到它与您描述的完全相同:

    
    


    但是请记住,即使您将
    ishitestvisible
    设置为
    false
    ,用户仍可以使用Tab更改聚焦元素,并使用空格或Return激活元素

    “将椭圆聚焦在一个元素上”功能可以很容易地处理如下:

    public void焦点元素(FrameworkElement)
    {
    点中心=新点(element.ActualWidth/2,element.ActualHeight/2);
    Point newPosition=元素.TranslatePoint(中心,ShowcasePath);
    椭圆梯度法。中心=新位置;
    }
    
    启用/禁用所有其他元素功能最好在您的viewmodel中使用,如果您没有,则类似于这样:

    private void diablallbutthisanditsparents(FrameworkElement this元素)
    {
    列表层次结构=FindParents(thisElement).ToList();
    foreach(层次结构中的FrameworkElement元素)
    {
    element.IsEnabled=true;
    如果(ReferenceEquals(element,thismelement))继续;
    for(int i=0;i
    把这些放在一起,它应该是这样的:


    那个巨大的红色盒子真的很刺眼@最终的颜色将是透明的白色。我知道这只是一个你想要覆盖的模型,只是很难看到(至少在我的LCD上)。也许更好的选择是绑定所有其他控件的
    可见性
    ,以便将除您希望显示的内容以外的所有内容设置为隐藏?@RonBeyer否,所有控件都应通过半透明白色可见。因此,我无法将
    可见性设置为该属性。绑定所有控件'a(您希望保持活动状态的控件除外)
    IsEnabled
    属性,然后在需要时将其设置为
    False
    。快乐编码:)除突出显示的项目外,应关闭所有项目的交互。另外,我想创建一个自定义控件。我不想弄乱
    IsEnabled
    ,因为它会更改look@VijayNirmal当然,您可以使用上述技术的任意组合。
    ishitestvisible
    工作正常。昨天,它没起作用。但我的方法的另一个问题是,椭圆内的每个控件都是难以处理的。假设我有一个按钮1和按钮2彼此靠近,那么即使按钮1高亮显示,我们仍然可以单击按钮2。