Панель інструментів WPF: як зняти зчеплення та перелив


98

У вкладеному меню WPF ToolBarPanel-ToolBar-Menu ми хочемо позбутися ручки зчеплення ліворуч та області переливу праворуч. вони обидва сірі, але ми хотіли б, щоб вони взагалі не відображалися.

будь-які ідеї щодо того, як це зробити?

на випадок, якщо мої умови не зовсім правильні, якщо ви подивитесь на зображення на малюнку 3 посилання нижче, на нижній з трьох панелей інструментів буде зчеплення зліва від випадаючого списку та праворуч від самого правого кнопка є переповнення.

Зображення панелей інструментів


Можливо, ви могли б це зробити, переписавши шаблон управління ... але я б не рекомендував цього.
apandit

Ви можете поставити Margin = "0,0, -14,0" на панелі інструментів, щоб висунути праву сторону з поля зору. Це найпростіше рішення, яке я знайшов, але я тестував лише на одній панелі інструментів, а не всередині панелі інструментів або панелі інструментів.
Wayne Bloss

Відповіді:


153

Знімок можна зняти, встановивши вкладене властивість ToolBarTray.IsLocked="True"на панелі інструментів.

Щоб видалити Overflow ToggleButton , вам доведеться видалити його у власному ControlTemplate, як це передбачає sixlettervariables, що, якщо у вас є суміш або ви можете завантажити попередній перегляд Blend 3, не надто складно.

Ви також можете просто приховати кнопку у завантаженому випадку панелі інструментів, хоча яким би маршрутом ви не пройшли, ви також повинні встановити вкладене властивість ToolBar.OverflowMode="Never"у меню панелі інструментів, щоб елементи не могли випадково перелитися в недосяжну область.

<ToolBarPanel DockPanel.Dock="Top">
    <ToolBar ToolBarTray.IsLocked="True" Loaded="ToolBar_Loaded">
        <Menu ToolBar.OverflowMode="Never">
            <MenuItem Header="File" />
            <MenuItem Header="New" />
        </Menu>
    </ToolBar>
</ToolBarPanel>

І встановіть для Overflow ToggleButton згорнуте значення:

private void ToolBar_Loaded(object sender, RoutedEventArgs e)
{
    ToolBar toolBar = sender as ToolBar;
    var overflowGrid = toolBar.Template.FindName("OverflowGrid", toolBar) as FrameworkElement;
    if (overflowGrid != null)
    {
        overflowGrid.Visibility = Visibility.Collapsed;
    }
    var mainPanelBorder = toolBar.Template.FindName("MainPanelBorder", toolBar) as FrameworkElement;
    if (mainPanelBorder != null)
    {
        mainPanelBorder.Margin = new Thickness();
    }
}

15
Постає питання: навіщо взагалі використовувати панель інструментів? Чому б просто не використовувати простий StackPanel з кнопками? Яку перевагу дає панель інструментів?
Josh G

5
У відповідь на Josh G: Якщо ви використовуєте прозору кнопку із зображенням на звичайній панелі (StackPanel тощо), вона матиме білий контур. Однак, коли ту саму кнопку розміщено на панелі інструментів, білого контуру немає.
Chris Bennet

2
Це також корисно, якщо ви хочете тематизувати панель інструментів у цьому контексті, наприклад, поведінку наведення курсора.
Greg D

36
FYI: Ви можете використовувати простий StackPanel і все одно отримати стиль панелі інструментів. <Кнопка Style = "{StaticResource {х: Static ToolBar.ButtonStyleKey}}"> <Image Source = "{StaticResource ZoomIn}"> </ Image> </ Button>
thrag

1
Крім того, я виявив, що якщо ви не хочете використовувати елемент керування <Menu> на панелі інструментів, властивість ToolBar.OverflowMode = "Ніколи" можна встановити безпосередньо в елементі керування <Button> на панелі інструментів. Це створило той ефект, який я шукав
брод

8

Ви можете використовувати Blend, щоб досить просто замінити ControlTemplate для панелі інструментів, меню чи панелі інструментів.

  1. Клацніть правою кнопкою миші на панелі інструментів і виберіть Редагувати шаблон
  2. У меню Змінити шаблон виберіть Редагувати копію
  3. Я рекомендую додати копію до словника ресурсів
  4. Клацніть Ok

Тепер ви будете редагувати шаблон управління для ToolBarPanel і можете встановити видимість на Collapsed для сигналу зчеплення та переповнення. Можна промити та повторити для інших елементів керування. Це трохи трудомістко, але з Blend це не дуже важко.


дякую за інформацію. на жаль, blend2 і vs2008, здається, не працюють добре для нас, занадто багато проблем, коли один працює з кодом, згенерованим в іншому, тому ми в даний час не дозволяємо blend наближатися до нашого коду vs;)
Том

1
Так, ми використовували Blend досить релігійно, поки не з’явився VS2k8SP1. Насправді я хотів би, щоб редактор WPF у VS2k8 був сумішшю. Набагато приємніше мати можливість клацнути правою кнопкою миші на щось і сказати Групувати в 'StackPanel' або 'Border'. Шкода, що МС хоче, щоб вони мали різний досвід.
user7116

Я думаю, що нові силові іграшки XAML додають функцію, яка дозволяє групувати елементи керування. (Можливо, це силові іграшки MoXAML ...)
Номер 8

8

Ви можете "видалити" переповнення, не надаючи новий шаблон керування, встановивши ToolBarдля негативних правих полів (і вкиньте від'ємне ліве поле, щоб воно не виглядало дивним із закругленими лівими краями, а квадратними правими краями). Потім додайте ClipToBounds="True"до цього, ToolBarPanelякий відріже краї панелі інструментів, які зараз стирчать за межами області панелі.

<ToolBarPanel Grid.Row="0" ClipToBounds="True">
    <ToolBar ToolBarTray.IsLocked="True" Margin="-5,0,-13,0" Padding="5,0,0,0">
    . . .

5

Замість того, щоб повністю приховувати кнопку переповнення, я вважаю, що краще показувати її лише тоді, коли це необхідно. Це можна зробити, прив’язавши його Visibilityвластивість до його IsEnabledвластивості:

private static void FixupToolBarOverflowArrow(ToolBar toolBar)
{
    Action fixup = () =>
    {
        var overflowButton = toolBar.Template.FindName("OverflowButton", toolBar) as ButtonBase;
        if (overflowButton != null)
        {
            overflowButton.SetBinding(
                VisibilityProperty,
                new Binding("IsEnabled")
                {
                    RelativeSource = RelativeSource.Self,
                    Converter = new BooleanToVisibilityConverter()
                });
        }
    };

    if (toolBar.IsLoaded)
    {
        fixup();
    }
    else
    {
        RoutedEventHandler handler = null;
        handler = (sender, e) =>
        {
            fixup();
            toolBar.Loaded -= handler;
        };

        toolBar.Loaded += handler;
    }
}

(те саме можна зробити в XAML, перевизначивши шаблон)


3

Я тільки починаю з WPF і не можу отримати жоден із наведених вище методів, щоб приховати свою стрілку переповнення (Visual Studio 2010). Єдине, що, здавалося, вплинуло на стрілку, - це приклад Toolbar_Load вище, але все, що було, це перетворити стрілку на порожній простір, який виглядав так само погано, як стріла. Найпростіший спосіб, який я міг зрозуміти, - це просто встановити поля панелі інструментів.

<ToolBar Height="26" 
         Name="toolBar" 
         DockPanel.Dock="Top" 
         ToolBarTray.IsLocked="True" 
         ToolBar.OverflowMode="Never"        <!-- no effect -->
         Margin="0,0,-13,0">                 <!-- worked -->
         <Menu ToolBar.OverflowMode="Never"> <!-- no affect -->
             <MenuItem Header="_File"></MenuItem>
         </Menu>
</ToolBar>

0

Наведені вище методи працюють, щоб приховати переповнення; Я використовував наступне, щоб приховати захоплювач:

         <Label Height="44" Width="30" Background="{StaticResource CtrlBackground}" Margin="-20,0,0,0"></Label>

для горизонтальної розкладки та

         <Label Height="44" Width="230" Background="{StaticResource CtrlBackground}" Margin="0,-20,0,0" HorizontalAlignment="Left"></Label>

для вертикального макета. Розмістіть вищезазначене після панелі інструментів (або ToolbarTray, якщо вона використовується)

Використовуйте будь-яку ширину та висоту, необхідні для ваших кнопок.

Kaxaml чудово грає з цим матеріалом.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.