System.Windows.Controls.Ribbon的顶部有一个22px左右的边距(边框、空格),为什么,如何正确去除?

最后发布: 2020-08-03


问题

这就是问题所在(红色箭头所示的不需要的边距)。

enter image description here

这是实际的XAML。

<Ribbon DockPanel.Dock="Top">

这是补丁 (在我看来,这是一个工作,但一个黑客,而不是一个真正的解决方案)。

<Ribbon DockPanel.Dock="Top" Margin="0, -22, 0, 0">

有了补丁(对我来说更多的是黑客攻击)。

enter image description here

为什么在Ribbon的顶部有一个边框(边框空间),以及如何在不被黑客攻击的情况下正确地删除这个边框(对我来说,边框-22是一个黑客)?

应用了解决方案(Ed Bayiates解决方案)。

<Ribbon DockPanel.Dock="Top" x:Name="MyRibbon" SizeChanged="RibbonSizeChanged">

private void RibbonSizeChanged(object sender, SizeChangedEventArgs e)
{
    ContentPresenter titlePanel = MyRibbon.Template.FindName("PART_TitleHost", MyRibbon) as ContentPresenter;
    if (titlePanel != null)
    {
        double titleHeight = titlePanel.ActualHeight;
        MyRibbon.Margin = new Thickness(MyRibbon.Margin.Left, -titleHeight, MyRibbon.Margin.Right, MyRibbon.Margin.Bottom);
    }
}
wpf xaml margin ribbon
回答

我想如果你在RibbonWindow而不是标准的Window中托管,问题区域会折叠到Window的标题栏中。

如果你不能做到这一点,有三个项目在该区域占据了同样的22像素空间。 一个是PART_TitleHost。 第二个是没有Name属性的DockPanel,第三个是没有Name属性的Border。 除非你把整个Ribbon重新模板化,否则我认为你不可能轻易地摆脱这些。 然而,如果你把y-margin设置成这个区域的精确大小,你可以让你的hacky少一点。 在后面的代码中,你可以得到标题栏的实际高度,并重新设置Ribbon栏的边距。

    private void MainWindow_Loaded(object sender, RoutedEventArgs e)
    {
        ContentPresenter titlePanel = Ribbon.Template.FindName("PART_TitleHost", Ribbon) as ContentPresenter;
        if (titlePanel != null)
        {
            double titleHeight = titlePanel.ActualHeight;
            Ribbon.Margin = new Thickness(Ribbon.Margin.Left, -titleHeight, Ribbon.Margin.Right, Ribbon.Margin.Bottom);
        }
    }

图片 该代码。

enter image description here

图片 该代码。

enter image description here