覆盖 AvalonDock 浮动 windows;忽略 zIndex

Overlaying AvalonDock floating windows; zIndex ignored

我正在尝试设置 AvalonDock 浮动 windows 的样式,以便我可以显示所有它们的叠加层。 我打算将其用于对话框服务,然后可以通过用半透明的实心画笔覆盖所有浮动 windows 来显示 "modal" 对话框。

我的想法是修改LayoutAnchorableFloatingWindwoControl 的样式。通用主题的原始样式可以在下面找到——包括我注释掉的叠加网格:

<Style x:Key="{x:Type avalonDockControls:LayoutAnchorableFloatingWindowControl}" TargetType="{x:Type avalonDockControls:LayoutAnchorableFloatingWindowControl}">
    <Setter Property="Background" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/>
    <Setter Property="shell:WindowChrome.WindowChrome">
        <Setter.Value>
            <shell:WindowChrome
                ResizeBorderThickness="10"
                CaptionHeight="16"
                CornerRadius="3,3,3,3"
                GlassFrameThickness="0"
                ShowSystemMenu="True"/>
        </Setter.Value>
    </Setter>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type avalonDockControls:LayoutAnchorableFloatingWindowControl}">
                <Grid>

                  <!-- My overlay grid:
                    <Grid x:Name="OVERLAY_GRID" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Background="Red" Panel.ZIndex="100000"/> 
                  -->

                    <Border  x:Name="WindowBorder" BorderThickness="3" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" BorderBrush="{DynamicResource {x:Static SystemColors.ControlDarkBrushKey}}">
                        <Grid Margin="3">
                            <Grid.RowDefinitions>
                                <RowDefinition Height="16"/>
                                <RowDefinition Height="*"/>
                            </Grid.RowDefinitions>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="*"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>

                                <Border
                                    Visibility="{Binding Path=Model.IsSinglePane, RelativeSource={RelativeSource TemplatedParent}, Converter={StaticResource BoolToVisibilityConverter}}">
                                    <avalonDockControls:DropDownControlArea 
                                        DropDownContextMenu="{Binding Model.Root.Manager.AnchorableContextMenu, RelativeSource={RelativeSource TemplatedParent}}"
                                        DropDownContextMenuDataContext="{Binding Path=SingleContentLayoutItem, RelativeSource={RelativeSource TemplatedParent}}">
                                        <ContentPresenter Content="{Binding Model.SinglePane.SelectedContent, RelativeSource={RelativeSource TemplatedParent}}" 
                                              ContentTemplate="{Binding Model.Root.Manager.AnchorableTitleTemplate, RelativeSource={RelativeSource TemplatedParent}}"
                                              ContentTemplateSelector="{Binding Model.Root.Manager.AnchorableTitleTemplateSelector, RelativeSource={RelativeSource TemplatedParent}}"/>
                                    </avalonDockControls:DropDownControlArea>
                                </Border>


                                <avalonDockControls:DropDownButton
                                    x:Name="SinglePaneContextMenu" ........../>
                                </avalonDockControls:DropDownButton>

                                <Button ...........>
                                </Button>

                                <Button ........>
                                </Button>

                                <Button .........>
                                </Button>
                            </Grid>
                            <ContentPresenter
                                Content="{TemplateBinding Content}" Grid.Row="1"/>
                        </Grid>
                    </Border>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="WindowState" Value="Maximized">
                        <Setter Property="Padding" Value="3" TargetName="WindowBorder"/>
                    </Trigger>
                    <Trigger Property="IsKeyboardFocused" Value="True">
                        <Setter TargetName="WindowBorder"  Property="BorderBrush" Value="{DynamicResource {x:Static SystemColors.HighlightBrushKey}}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

当我使用带有常规通用主题的原始 MVVMTestApp 时,浮动窗口如下所示:

当我取消注释 OVERLAY_GRID 时,您会认为整个 window 都被一个巨大的红色块隐藏了。但是,有一个问题...

我完全不知道是什么原因造成的。 我已经尝试给 WindowBorder 和 ContentPresenter 显式降低 Panel.ZIndex 值,但这没有帮助。

我还将 WindowBorder 包装在 AdornerDecorator 元素中,然后尝试在代码中覆盖装饰层,但我遇到了同样的问题; ContentControl 仍在顶部。我不知道这里发生了什么。

AvalonDock 从 HwndHost 派生 类 以显示其浮动 windows - 这会导致 Airpsace 问题导致我的问题吗?再一次,我实际上认为这只会在您混合使用 WinForms 时发生,而据我所知,所有托管元素都是纯 WPF。

有谁知道是什么原因导致的 - 或者更好的是,如何解决这个问题?

仅供参考,如果其他人以后正在寻找解决方案,我在这里与开发人员讨论了这个问题

http://wpftoolkit.codeplex.com/discussions/651639

我的解决方案是用另一个控件(例如 ContentPresenter)替换 FloatingWindowContentHost(它使用 HwndHost 实现 WinForms 兼容性)。相对容易修复,只要您不打算在其中托管任何 WinForms。它确实需要您自己重新编译 AvalonDock,因为这是一个代码更改。