Как я могу установить сплошной цвет в качестве фона для всего меню? - PullRequest
1 голос
/ 13 ноября 2009

Как я могу изменить свое меню, чтобы оно показывало весь цвет, а не так:

alt text

Вот мой код:

<DockPanel>
    <Menu DockPanel.Dock="Right"
          Height="30"              
          VerticalAlignment="Top"
          Background="#2E404B"
          BorderThickness="2.6" 
          Foreground="#FFAA00">
        <Menu.BitmapEffect>
            <DropShadowBitmapEffect Direction="270" ShadowDepth="3" Color="#2B3841"/>
        </Menu.BitmapEffect>

        <MenuItem Header="File" >
            <MenuItem Header="New Build" Background="#2E404B"></MenuItem>
            <Separator />
            <MenuItem Header="Exit" Background="#2E404B"></MenuItem>
        </MenuItem>

        <MenuItem Header="Edit" >
            <MenuItem Header="Language" Background="#2E404B"></MenuItem>
            <MenuItem Header="Display Mode" Background="#2E404B"></MenuItem>
            <Separator />
            <MenuItem Header="Settings" Background="#2E404B"></MenuItem>
        </MenuItem>

        <MenuItem Header="View" >

        </MenuItem>
        <MenuItem Header="About" >

        </MenuItem>
    </Menu>
</DockPanel>

Кроме того, я понимаю, что я устанавливаю цвет во всех экземплярах MenuItem, если бы кто-то мог показать мне более эффективный способ сделать это, это было бы также здорово. : D

Ответы [ 3 ]

4 голосов
/ 13 ноября 2009

Сложность в том, что нужные вам цвета скрыты глубоко в стилях темы Menu. Эти стили темы являются одними из самых сложных среди тех, которые поставляются с WPF. Они состоят из 10-20 стилей и шаблонов.

В общем, я рекомендую создавать стили, аналогичные тем, которые приведены в ответе itowlson, поскольку он позволяет изящно адаптироваться к текущей теме Windows, заменяя только те свойства и шаблоны, которые вы хотите изменить, и оставляя все остальное таким же.

В вашем случае переопределение стилей темы по частям путем добавления отдельных тегов, вероятно, будет бесполезным упражнением. К счастью вам не нужно это делать .

Очевидно, что вы на самом деле пытаетесь создать свою собственную пользовательскую тему с точки зрения взаимодействия с пользователем, так почему бы на самом деле не создать свою собственную тему в коде? Вы можете сделать это легко, скопировав тему из Aero или Luna (как вам нравится) и изменив все, что вы хотите, чтобы получить именно тот вид, который вы хотите.

Это очень просто сделать с помощью Expression Blend. Просто:

  1. Создайте пустое окно и добавьте в него меню.
  2. Щелкните правой кнопкой мыши Меню и выберите Edit Control Parts (Template) > Edit a Copy....
  3. В диалоговом окне выберите Apply to All и нажмите New рядом с Resource dictionary
  4. Введите новое имя файла ResourceDictionary, например «MyMenuTheme.xaml»
  5. В вашем App.xaml используйте MergedDictionaries для включения MyMenuTheme.xaml в ресурсы вашего приложения

Теперь вы можете вносить любые изменения, которые вы хотите внести в MyMenuTheme.xaml, чтобы повлиять на внешний вид всех меню в приложении. Этот файл будет длиной в несколько сотен строк, но обычно легко найти правильные настройки для изменения. В вашем случае это будут различные настройки по умолчанию для настроек фона.

Обратите внимание, что если у вас нет Expression Blend, вы можете также начать стили стилей с использованием отражателя и BAMLViewer, но это намного сложнее, так как вам придется вручную выбирать стили и другие необходимые вам ресурсы.

0 голосов
/ 06 сентября 2011

Зайдите в App.xaml или используйте Ctrl + F и найдите эту присоску

<SolidColorBrush x:Key="SubMenuBackgroundBrush" Color="#FF9B9B9B"/>
0 голосов
/ 13 ноября 2009

Чтобы установить фон для всех экземпляров MenuItem, определите стиль для MenuItem:

<Style x:Key="{x:Type MenuItem}">
  <Setter Property="Background" Value="#2E404B" />
</Style>

Вы должны быть в состоянии сделать то же самое для класса Separator, чтобы отшлифовать оставшиеся биты, хотя из-за проблем с контрастностью может потребоваться стилизовать весь шаблон, а не только фон.

В качестве альтернативы вам может понадобиться / вы хотите захватить MenuItem.SeparatorStyleKey, MenuItem.TopLevelItemTemplateKey и т. Д.

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