System. Windows .Controls.Ribbon имеет верхнее поле (граница, пробел) около 22 пикселей сверху, почему и как его правильно удалить? - PullRequest
1 голос
/ 22 апреля 2020

Это проблема (ненужное поле показано красной стрелкой):

enter image description here

Это фактический XAML:

<Ribbon DockPanel.Dock="Top">

Это патч (который мне кажется работающим, но взломанный вместо реального решения):

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

С патчем (скорее взлом, чем что-либо еще) еще мне):

enter image description here

Почему в верхней части ленты есть поле (граница / пробел) и как правильно удалить это поле без хак (маржа -22 для меня хак)?

Решение применено (решение Эда Байятса):

<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);
    }
}

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что рассматриваемая область сворачивается в заголовок окна, если вы размещаете в RibbonWindow вместо стандартного окна.

Если вы не можете сделать это, есть три элемента, которые занимают одинаковые 22 пикселя пространство в этой области. Одним из них является PART_TitleHost. Вторым является DockPanel без атрибута Name, а третьим является Border без атрибута Name. Если вы не измените шаблон всей ленты, я не думаю, что вы можете легко избавиться от них. Тем не менее, вы можете сделать свой хак менее хакерским, если вы установите Y-поле для точного размера этой области. В коде сзади вы можете получить фактическую высоту заголовка и сбросить поле на ленте:

    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

...