4

我有一个 RibbonWindow,我的 WindowStyle 设置为 None,所以我不明白 Grip 发生了什么来调整窗口大小?!即使我的控件在底部将它们的边距设置为 0,它们的底部也会被隐藏......这是一种奇怪的行为。

但是如果我更改控件的底部边距就可以了,但是无论如何都看不到Grip,可能是因为客户区的一部分被隐藏了......

我不得不说,如果有一个 WPF 窗口,这不会发生,它只会发生在 RibbonWindow 上。我正在使用 RibbonWindow,因为 Ribbon 在正确的窗口中有其他外观。

那么我该怎么做才能解决Grip的问题呢?

我的一些代码...

<rib:RibbonWindow x:Class="MyApp.Views.MainView"
                  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                  xmlns:rib="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
                  AllowsTransparency="True"
                  Background="Transparent"
                  Height="750"
                  ResizeMode="CanResizeWithGrip"
                  Width="1000"
                  WindowStartupLocation="CenterScreen"
                  WindowStyle="None">

    <Grid Margin="0, 0, 0, 20">
        <Border Background="Black"
                CornerRadius="5"
                Opacity="0.5"/>
    </Grid>
</rib:RibbonWindow>

提前致谢!

4

1 回答 1

7

这对调试很有趣。原来窗口的样式有一个错误:如果系统被定义为IsGlassEnabled == true(在 Win7 Aero 主题中true),那么窗口依赖于 Microsoft.Windows.Shell.WindowChrome(来自 Microsoft.Windows.Shell 程序集)绘制窗口的边框和顶部按钮;并且此 WindowChrome 将其GlassFrameThickness属性设置为与set to8,30,8,8结合使用。NonClientFrameEdgesBottom

发生的情况是,由于AllowsTransparency == true玻璃边框是透明的,但窗口仍然从整体窗口大小“削减”其厚度,因为WindowChrome定义了NonClientFrameEdges="Bottom",从而削减了ResizeGrip视图。

如果您(疯狂地)将窗口拖到屏幕上,您会看到这一点 - 您会看到ResizeGrip闪烁。

为了解决这个问题,我们需要定义一个新WindowChrome的 with NonClientFrameEdges="None"(或两者)并仅在(我使用 App.xaml 中定义的应用程序资源并仅定义)GlassFrameThickness = 0时将其分配给窗口:IsGlassEnabled == true && AllowsTransparency == trueNonClientFrameEdges="None"

1. Add these namespaces to App.xaml:
    xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
    xmlns:ribbonPrimitives="clr-namespace:Microsoft.Windows.Controls.Ribbon.Primitives;assembly=RibbonControlsLibrary"
    xmlns:shell="clr-namespace:Microsoft.Windows.Shell;assembly=Microsoft.Windows.Shell"

2. Add these resources:
    <ribbonPrimitives:RibbonWindowSmallIconConverter x:Key="RibbonWindowSmallIconConverter" />
    <shell:WindowChrome x:Key="WindowChromeWithGlassAndTransparency"
                        NonClientFrameEdges="None" />
    <Style x:Key="MyStyle"
           TargetType="{x:Type ribbon:RibbonWindow}">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsGlassEnabled, Source={x:Static shell:SystemParameters2.Current}}"
                               Value="True" />
                    <Condition Binding="{Binding AllowsTransparency, RelativeSource={RelativeSource Mode=Self}}"
                               Value="False" />
                </MultiDataTrigger.Conditions>
                <Setter Property="shell:WindowChrome.WindowChrome"
                        Value="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type ribbon:Ribbon}, ResourceId=WindowChromeAeroWithGlass}}" />
            </MultiDataTrigger>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding Path=IsGlassEnabled, Source={x:Static shell:SystemParameters2.Current}}"
                               Value="True" />
                    <Condition Binding="{Binding AllowsTransparency, RelativeSource={RelativeSource Mode=Self}}"
                               Value="True" />
                </MultiDataTrigger.Conditions>
                <Setter Property="shell:WindowChrome.WindowChrome"
                        Value="{DynamicResource WindowChromeWithGlassAndTransparency}" />
            </MultiDataTrigger>
            <DataTrigger Binding="{Binding Path=IsGlassEnabled, Source={x:Static shell:SystemParameters2.Current}}"
                         Value="True">
                <!--This is the original setter of the chrome that makes all the trouble-->
                <!--<Setter Property="shell:WindowChrome.WindowChrome"
                    Value="{DynamicResource {ComponentResourceKey TypeInTargetAssembly={x:Type ribbon:Ribbon}, ResourceId=WindowChromeAeroWithGlass}}" />-->
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type ribbon:RibbonWindow}">
                            <Grid>
                                <Border Name="PART_ClientAreaBorder"
                                        Background="{TemplateBinding Control.Background}"
                                        BorderBrush="{TemplateBinding Control.BorderBrush}"
                                        BorderThickness="{TemplateBinding Control.BorderThickness}"
                                        Margin="{Binding Path=WindowNonClientFrameThickness, Source={x:Static shell:SystemParameters2.Current}}" />
                                <Border BorderThickness="{Binding Path=(shell:WindowChrome.WindowChrome).ResizeBorderThickness, RelativeSource={RelativeSource TemplatedParent}}">
                                    <Grid>
                                        <Image Name="PART_Icon"
                                               shell:WindowChrome.IsHitTestVisibleInChrome="True"
                                               HorizontalAlignment="Left"
                                               VerticalAlignment="Top"
                                               Source="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Icon, Converter={StaticResource RibbonWindowSmallIconConverter }}"
                                               Width="{Binding Path=SmallIconSize.Width, Source={x:Static shell:SystemParameters2.Current}}"
                                               Height="{Binding Path=SmallIconSize.Height, Source={x:Static shell:SystemParameters2.Current}}" />
                                        <AdornerDecorator>
                                            <ContentPresenter Name="PART_RootContentPresenter" />
                                        </AdornerDecorator>
                                        <ResizeGrip Name="WindowResizeGrip"
                                                    shell:WindowChrome.ResizeGripDirection="BottomRight"
                                                    HorizontalAlignment="Right"
                                                    VerticalAlignment="Bottom"
                                                    Visibility="Collapsed"
                                                    IsTabStop="False" />
                                    </Grid>
                                </Border>
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Value="{x:Null}"
                                         Property="Icon">
                                    <Setter TargetName="PART_Icon"
                                            Property="Source"
                                            Value="/RibbonControlsLibrary;component/Images/GlassyDefaultSystemIcon.png" />
                                </Trigger>
                                <Trigger Property="WindowState"
                                         Value="Maximized">
                                    <Setter TargetName="PART_Icon"
                                            Property="Margin"
                                            Value="0,2,0,0" />
                                </Trigger>
                                <MultiTrigger>
                                    <MultiTrigger.Conditions>
                                        <Condition Property="ResizeMode"
                                                   Value="CanResizeWithGrip" />
                                        <Condition Property="WindowState"
                                                   Value="Normal" />
                                    </MultiTrigger.Conditions>
                                    <Setter TargetName="WindowResizeGrip"
                                            Property="Visibility"
                                            Value="Visible" />
                                </MultiTrigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </DataTrigger>
        </Style.Triggers>
    </Style>

3. In your window use the new style:
    <rib:RibbonWindow ....
                      Style="{StaticResource MyStyle}">

        ....
    </rib:RibbonWindow>

几乎与DataTrigger原始样式相同,只有一处修改:我已经评论了 WindowChrome 的设置器。

MultiDataTriggers是我的补充。他们检查属性的值并应用AllowsTransparency正确的 WindowChrome:如果值为原始值,则为原始值false,如果值为.NonClientFrameEdges="None"GlassFrameThickness = 0true

注意:此解决方案消除了使用边缘调整窗口大小的能力,窗口大小的调整仅由ResizeGrip.

于 2011-11-01T23:15:47.377 回答