Применение лентыМеню Вспомогательный Размер панели - PullRequest
2 голосов
/ 20 июля 2011

Как изменить размер AuxilaryPane в WPF Ribbon ApplicationMenu?Я добавил недавний список файлов в эту область, но он усекается.В идеале я бы хотел, чтобы вспомогательная панель заполняла экран так же, как для Word / Excel.

Мой код:

<r:Ribbon.ApplicationMenu>
    <r:RibbonApplicationMenu>
        <r:RibbonApplicationMenu.AuxiliaryPaneContent>
            <StackPanel>
                <TextBlock Text="Recent Files" />
                <Separator />
                <ItemsControl ItemsSource="{Binding RecentFiles}">
                    <ItemsControl.ItemTemplate>
                        <DataTemplate>
                            <r:RibbonApplicationMenuItem Header="{Binding ShortPath}" 
                                                         Command="{Binding DataContext.OpenRecentFileCommand, RelativeSource={RelativeSource AncestorType=ItemsControl}}"
                                                         CommandParameter="{Binding LongPath}"/>
                        </DataTemplate>
                    </ItemsControl.ItemTemplate>
                </ItemsControl>
            </StackPanel>
        </r:RibbonApplicationMenu.AuxiliaryPaneContent>
    </r:RibbonApplicationMenu>                
</r:Ribbon.ApplicationMenu>

Ответы [ 6 ]

2 голосов
/ 09 марта 2016

Основываясь на ответах в этой теме, я нашел, что проще всего создать подкласс RibbonApplicationMenu и установить для ширины третьего столбца значение Авто.

 public class CustomRibbonApplicationMenu : System.Windows.Controls.Ribbon.RibbonApplicationMenu
    {
        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();

            System.Windows.DependencyObject obj = this.GetTemplateChild("PART_AuxiliaryPaneContentPresenter");

            System.Windows.Controls.ContentPresenter c = obj as System.Windows.Controls.ContentPresenter;

            ((System.Windows.Controls.Grid)((System.Windows.Controls.Border)c.Parent).Parent).ColumnDefinitions[2].Width = System.Windows.GridLength.Auto;
        }
    }

Теперь вам просто нужно поменять свою ленту xaml с

<Ribbon.ApplicationMenu>
                <RibbonApplicationMenu>

до

<Ribbon.ApplicationMenu>
                <ctrl:CustomRibbonApplicationMenu>
2 голосов
/ 16 июля 2012

Если вы ищете очень быстрое решение для увеличения высоты, вы можете просто добавить несколько бесполезных RibbonApplicationMenuItems, чтобы дополнить коробку (и не нужно изменять исходный код MS).

            <ribbon:Ribbon.ApplicationMenu>
            <ribbon:RibbonApplicationMenu>
                <ribbon:RibbonApplicationMenu.Items>
                    <ribbon:RibbonApplicationMenuItem Name="saveSettings" Header="Save Settings" />
                    <ribbon:RibbonApplicationMenuItem IsEnabled="False"/> <!--USELESS-->
                    <ribbon:RibbonApplicationMenuItem IsEnabled="False"/> <!--USELESS-->
                </ribbon:RibbonApplicationMenu.Items>

                <ribbon:RibbonApplicationMenu.AuxiliaryPaneContent >
                        <StackPanel Orientation="Vertical" >
                            <GroupBox>
                                <Label Content="System Settings" />
                            </GroupBox>
                            <StackPanel Orientation="Horizontal">
                            </StackPanel>
                        </StackPanel>
                </ribbon:RibbonApplicationMenu.AuxiliaryPaneContent>
            </ribbon:RibbonApplicationMenu>
        </ribbon:Ribbon.ApplicationMenu>
1 голос
/ 14 ноября 2014

Это старый поток, да, и у него есть несколько хороших идей, но я не был удовлетворен.

Моя проблема немного отличалась тем, что мне нужно, чтобы ApplicationMenu расширялся только настолько, чтобы соответствовать любому элементу управленияэто было помещено во вспомогательную панель.

В конце концов я глубоко копал и нашел решение, которое меня порадовало.Это не решает проблему «заполнить экран», но я надеюсь, что это поможет другим, кто приземлится здесь, в поисках решения проблемы, аналогичной моей.Извините, если похоже, что я пытаюсь похитить нить.Я не собираюсь.

По сути, я решил проблему фиксированной ширины и высоты, изменив стиль ленты:

  • Откройте сборку ленты в JetBrains DotPeek
  • Откройте ресурсы / System.Windows.Controls.Ribbon.g.resources / Themes / generic.baml
  • Скопируйте весь словарь ресурсов в файл .xaml в своем проекте.Возможно, вам удастся использовать только его часть, но я решил взять все это целиком.

В этот момент вы можете спросить: «Почему бы просто не использовать VS или Blend илиShowMeTheTemplate вместо DotPeek? "Все эти инструменты с треском провалились на ленте в сборе.Не знаю почему.Они не сказали.Одна из проблем, возникающих при использовании DotPeek, заключается в том, что некоторые ссылки на пространства имен нужно будет скорректировать, но это не слишком сложно, поэтому я не буду вдаваться в подробности.

Итак, теперь у вас есть все стили ишаблоны, иди поищи разметочную разметку.

Сначала исправь ширину:

  • Ищи сетку, в определении третьего столбца которой статическое значение равно 300. Можно поискать <ColumnDefinition Width="300"/>.Есть только один.
  • Измените "300" на "Auto".

Затем установите высоту:

  • Найдите определение PART_SubmenuPlaceholder Граница.Вы можете искать x:Name="PART_SubmenuPlaceholder".Это примерно на 50 строк ниже изменения, которое вы сделали для ширины.
  • Эта граница привязывает свойство Height к свойству ActualHeight элемента управления "MainPaneBorder": Height="{Binding ElementName=MainPaneBorder, Path=ActualHeight}".
  • Удалить эту высотуопределение.

Теперь, когда вы изменили стиль, просто добавьте этот словарь ресурсов в ваш xaml, и он должен применить себя к ленте.

1 голос
/ 27 сентября 2011

Я искал решение для той же проблемы.

Нет прямого свойства для изменения этого.

Пример создания такого свойства можно найти по адресу msdn

вот основное решение:

Измените исходный код библиотеки лент.MS предоставила исходный код библиотеки лент: http://www.microsoft.com/downloads/en/details.aspx?FamilyID=2bfc3187-74aa-4154-a670-76ef8bc2a0b4

Загрузите исходный код и откройте его, в MicrosoftRibbonForWPFSourceAndSamples \ RibbonControlsLibrary \ Microsoft \ Windows \ Controls \ Ribbon \ RibbonApplicationMenu.cs, добавьте одно свойство зависимости:

    public double MinMenuHeight
    {
      get { return (double)GetValue(MinMenuHeightProperty); }
      set { SetValue(MinMenuHeightProperty, value); }
    }
    public static readonly DependencyProperty MinMenuHeightProperty =
        DependencyProperty.Register("MinMenuHeight", typeof(double), typeof(RibbonApplicationMenu), new UIPropertyMetadata(0.0));

В MicrosoftRibbonForWPFSourceAndSamples \ RibbonControlsLibrary \ Themes \ Generic.xaml, строка 7519 добавьте код XAML:

    <Border x:Name="PopupBorder" MinHeight="{TemplateBinding MinMenuHeight}" BorderBrush="{Binding RelativeSource={RelativeSource AncestorType={x:Type ribbon:RibbonMenuButton}}, Path=Ribbon.BorderBrush}" Background="{Binding RelativeSource={RelativeSource AncestorType={x:Type ribbon:RibbonMenuButton}}, Path=Ribbon.Background}" BorderThickness="1" CornerRadius="2">
        <Grid>

        </Grid>
    </Border>

Добавьте только первые две строки данного xaml

0 голосов
/ 08 февраля 2013

Вы можете загрузить исходный код Microsoft Ribbon для WPF (http://www.microsoft.com/en-us/download/details.aspx?id=11877)) и добавить DependencyProperty Width / Height в ApplicationMenu или просто сделать это «быстро и грязно», как в моем примере:

MainWindow.xaml

public partial class MainWindow : RibbonWindow
{
    private Size DefaultApplicationMenuSize;

    public MainWindow()
    {
        InitializeComponent();
    }

    private void RibbonWindow_Loaded(object sender, RoutedEventArgs e)
    {
        var grid = (myRibbon.ApplicationMenu.Template.FindName("MainPaneBorder", myRibbon.ApplicationMenu) as Border).Parent as Grid;
        /* before the first opening of the menu the size is NaN, so you have to measure size and use the DesiredSize */
        grid.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        this.DefaultApplicationMenuSize = new Size(grid.ColumnDefinitions[2].Width.Value, grid.DesiredSize.Height);
    }

    private void RibbonApplicationMenuItem_MouseEnter(object sender, MouseEventArgs e)
    {           
        Button b=new Button();
        b.Content = "my epic button";
        b.Width = 500;
        b.Height = 500;
        b.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
        SetApplicationMenuSize(b.DesiredSize);
        this.ribbonContentPresenter.Content = b;
    }

    private void RibbonApplicationMenuItem_MouseLeave(object sender, MouseEventArgs e)
    {
        SetApplicationMenuSize(DefaultApplicationMenuSize);
        this.ribbonContentPresenter.Content = null; 
    }

    private void SetApplicationMenuSize(Size size)
    {
        var grid = (myRibbon.ApplicationMenu.Template.FindName("MainPaneBorder", myRibbon.ApplicationMenu) as Border).Parent as Grid;
        /* you can modify the width of the whole menu */
        //grid.Width = size.Width;
        /* or just the size of RibbonApplicationMenu.AuxiliaryPaneContent */
        grid.ColumnDefinitions[2].Width = new GridLength(size.Width);
        grid.Height = size.Height;
    }
}

MainWindow.xaml.cs

<ribbon:RibbonWindow x:Class="WpfRibbonApplication.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"
        Title="MainWindow"
        x:Name="RibbonWindow"
        Width="640" Height="480"
        Loaded="RibbonWindow_Loaded">

    <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <ribbon:Ribbon x:Name="myRibbon">
            <ribbon:Ribbon.ApplicationMenu>
                <ribbon:RibbonApplicationMenu SmallImageSource="Images\SmallIcon.png">
                    <ribbon:RibbonApplicationMenuItem Header="Hello _Ribbon"
                                                      ImageSource="Images\LargeIcon.png"/>
                    <ribbon:RibbonApplicationMenuItem Header="HoverTest"
                                                      ImageSource="Images\LargeIcon.png"
                                                      MouseEnter="RibbonApplicationMenuItem_MouseEnter"
                                                      MouseLeave="RibbonApplicationMenuItem_MouseLeave" 
                                                      StaysOpenOnClick="True" />
                    <ribbon:RibbonApplicationMenu.FooterPaneContent>
                        <ribbon:RibbonButton Label="What ever" HorizontalAlignment="Right"/>
                    </ribbon:RibbonApplicationMenu.FooterPaneContent>
                    <ribbon:RibbonApplicationMenu.AuxiliaryPaneContent>
                        <ribbon:RibbonContentPresenter Name="ribbonContentPresenter" />
                    </ribbon:RibbonApplicationMenu.AuxiliaryPaneContent>
                </ribbon:RibbonApplicationMenu>
            </ribbon:Ribbon.ApplicationMenu>            
        </ribbon:Ribbon>         
    </Grid>
</ribbon:RibbonWindow>

хорошего дня

0 голосов
/ 08 ноября 2011

Когда я наткнулся на этот ответ (во время поиска ответа на свой, немного другой вопрос), я не слишком обрадовался фактическому изменению кода Microsoft.
В результате яскорее предпочтительнее создать его подкласс и получить необходимый элемент пользовательского интерфейса, используя base.GetTemplateChild на соответствующем «PART _...».
Я полагаю, вы можете использовать аналогичный подход для достижения того, что вам нужно.Мой пример: здесь .

Надеюсь, это поможет.
PS Если вам удастся найти способ определения необходимой ширины вспомогательной панели, пожалуйста, дайте мне знать - я хотел быпосмотрите, применимо ли это к ширине меню.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...