【问题标题】:Override MediaElement on top of Webview2在 Webview2 之上覆盖 MediaElement
【发布时间】:2022-01-16 17:08:05
【问题描述】:

我创建了一个 WPF 项目,我需要在其中显示两个 StackPanels,如下所示:

此屏幕是主网格的子屏幕

StackPanel 1 将在不改变宽度和高度的情况下显示,我需要在前一个 StackPanel 之上显示整个第二个 StackPanel。在这种情况下,使用 CanvasDockPanel 对我没有帮助。

<Grid>

    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>
    
    <StackPanel VerticalAlignment="Center" Grid.Row="0" x:Name="web1">
        <wv2:WebView2 Name="MyWebView"
             Height="800" >
        </wv2:WebView2>
    </StackPanel>

    <StackPanel Grid.Row="0" x:Name="videoPlayerPanel">
        <Canvas >
            <local:VideoPlayer x:Name="videoPlayer"  Background="AntiqueWhite"/>
        </Canvas>
    </StackPanel>

</Grid>

【问题讨论】:

  • 请点击WPF覆盖查看图片

标签: c# .net wpf xaml stackpanel


【解决方案1】:

Grid 中定义StackPanels 的顺序很重要。下一项显示在上一项之上。在您的示例中,videoPlayerPanel 将高于web1,因为它是在web1 之后定义的。有两种方法可以改变这种行为。

  1. 改变顺序,在web1之前定义videoPlayerPanel,在videoPlayerPanel上方显示web1

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel Grid.Row="0" x:Name="videoPlayerPanel">
            <Canvas >
                <local:VideoPlayer x:Name="videoPlayer"  Background="AntiqueWhite"/>
            </Canvas>
        </StackPanel>
        <StackPanel VerticalAlignment="Center" Grid.Row="0" x:Name="web1">
            <wv2:WebView2 Name="MyWebView"
                 Height="800" >
            </wv2:WebView2>
        </StackPanel>
    </Grid>
    
  2. 通过为项目设置 ZIndex 来明确定义 Z-Order。

    获取或设置一个值,该值表示元素出现在 z 平面上的顺序。 [...] 给定元素的值越大,该元素出现在前景中的可能性就越大。

    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
        <StackPanel VerticalAlignment="Center" Grid.Row="0" x:Name="web1" ZIndex="1">
            <wv2:WebView2 Name="MyWebView"
                 Height="800" >
            </wv2:WebView2>
        </StackPanel>
        <StackPanel Grid.Row="0" x:Name="videoPlayerPanel">
            <Canvas >
                <local:VideoPlayer x:Name="videoPlayer"  Background="AntiqueWhite"/>
            </Canvas>
        </StackPanel>
    </Grid>
    

默认的ZIndex 为零,这就解释了为什么order in the Grid matters

Children 集合中具有相等 ZIndex 值的成员按照它们在可视化树中出现的顺序呈现。您可以通过迭代 Children 集合的成员来确定子项的索引位置。

【讨论】:

  • 感谢您的回答,我已经尝试了两种方法,但我仍然没有在 stackpanel1 之上获得 stackpanel2
  • @unkownCoder 你试过没有wv2:WebView2local:VideoPlayer吗?也许它与这些控件之一有关。
  • 我试过了,但没有结果。这里视频正在播放,但仍在 web1 stackpanel 后面,它应该在 web1 之上
  • @unkownCoder 因此,您删除了两个控件并对其进行了测试,例如设置背景颜色以使StackPanels 都可见?结果不是什么意思?究竟发生了什么?显示什么?
  • web1 使用橙色背景,videoPlayer 使用黄色背景,我只能看到橙色背景,当我隐藏橙色背景黄色显示时,这意味着黄色背景仍然在后面橙色的
【解决方案2】:

我同意@thatguy 的回答,如果我们使用zIndex,我们可以在WPF 中重叠元素,但这里的问题与webview2 和mediaElement 有关。 截至目前 webview2 不允许另一个元素出现在顶部。 所以到目前为止还没有办法在 webview 上显示你的 mediaElement 。 此问题请参考此链接:Webview2 issue

您可以尝试使用 popup 显示 mediaElement 但这会带来其他问题 我认为这是您现在问题的唯一答案。

【讨论】:

  • ZIndex-order 可能在 webview 上不起作用,这就是总结
  • 也许你是对的,我尝试了所有类型的 Pannel ,对于其他元素,我只能重叠 webview2 面临的问题。我会尝试弹出窗口,感谢您的正确指导
猜你喜欢
  • 2021-11-20
  • 1970-01-01
  • 1970-01-01
  • 2012-04-01
  • 2012-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多