« first day (842 days earlier)      last day (2189 days later) » 
06:00 - 18:0018:00 - 21:00

6:19 AM
0
Q: SideMenu. Как сделать подпункты

BretbasПривет всем. Ребят, не могу понять, как вообще можно сделать кастомное меню? Вот к примеру у меня есть UserControl: <!-- Menu Items --> <ScrollViewer VerticalScrollBarVisibility="Auto"> <ItemsControl ItemsSource="{Binding ElementName=UC, Path=MenuItems}"> <ItemsControl.ItemTemplate> ...

@Андрей @FoggyFinder Ребят, моя цель просто научиться и понять как можно больше в IT технологиях. Мне скоро на волю, и я бы хотел как можно больше охватить знаний в программировании, чтобы была возможность с судимостью работать в этой сфере. Так что не обессудьте за глупые вопросы, но мне не у кого больше спрашивать, только интернет. Если Вы думаете, что Вы первые, на кого я нападаю со своими тупыми вопросами, то это не так. Я полтора года назад нападал на GameDev.ru
пытался разобраться в gamedev индустрии. Писал свой движок даже на C++, с использованием Physx, DirectX
вот мой последний продукт на моем движке gamedev.ru/projects/forum/?id=228076 если кому интересно
Теперь я хочу понять WPF. Для меня это все новое, да C# тоже достаточно новый. Хотя с ним мне более легко разобраться было после C++
 
@Bretbas а почему вам просто не кастомизировать стандартное меню?
 
@Андрей я думал об этом вначале, но потом захотел все таки свое сделать. Разве сложно свое сделать?
 
@Bretbas хз, не пробовал никогда
 
#@Андрей
@Андрей Ну вот, может есть смысл попробовать?:) И я , и Вы будете знать как это делается:)
 
@Bretbas времени, к сожалению, сейчас нету, нужно на работе проект завершить
 
6:31 AM
@Андрей Вы предложили тогда использовать Popup/Tooltip, но я так и не понял, как сделать так, чтобы он появлялся сбоку и у него был стиль такой же, как и у меню вообщем. И чтобы он появлялся по нажатию на пункт
Еще бы хотел узнать, вот что. У AttachedProperty, при регистрации, можно задать два callback'а, один на ValueChanged, другой на ValueUpdated. В чем разница, между Changed и Updated?:)
 
@Bretbas MSDN что говорит?
 
Я еще не смотрел:) Только пришел на работу:) Мне просто нельзя вообще пользоваться интернетом до 17:00. Но жажда программирования берет свое:)
 
 
2 hours later…
8:52 AM
@Bretbas я тоже всегда первым рассматриваю вариант с настройкой существующих элементов (или существующих библиотек) а лишь потом писать что-то свое.
 
9:26 AM
Кто нибудь поможет с меню?:)
 
 
6 hours later…
3:41 PM
@Bretbas Смотрите. OnMenuPlacementChanged вызывается тогда, когда значение attached property изменяется для какого-то из контролов
> Я знаю, что в FrameworkPropertyMetadata можно еще передавать callback на ValueUpdated
Это он и есть
> В чем разница между двумя этими callback'ами?
Между какими? Вроде ж только один?
 
ща минутку, у нас тут мусора пришли
 
> Зачем-то проверяете пункт на IsLoaded, потом отписываетесь/подписываетесь на событие Loaded. Вообще что это?
Очень просто. Смотрите, мы хотим получить имя изнутри шаблона.
Но шаблон может быть ещё не применён
Помните про OnApplyTemplate?
2
A: Обращение к внутренним контролам, которые находятся в Template моего UserControl'а

VladDМожно. Для этого вы должны сделать следующее. Объявите в вашем классе (наследующем UserControl) нужные имена при помощи атрибута TemplatePart. Правила хорошего тона также рекомендуют, чтобы имена начинались с PART_. Пусть вам нужен Grid, который вы хотите назвать PART_MainGrid. Это не обязатель...

Так вот, когда мы находимся в OnMenuPlacementChanged, мы не знаем, шаблон уже создан или нет
Поэтому мы идём на трюк
Мы опрашиваем IsLoaded. Известно (и документировано в MSDN), что IsLoaded устанавливается в true когда шаблон уже применён
Поэтому если IsLoaded = true, мы можем сразу лезть за попапом.
А если IsLoaded = false, то лезть за попапом смысла нет, шаблон ещё не применён, и Template.FindName ничего не даст
Поэтому нужно дождаться момента, когда шаблон применится
Для этого мы подписываемся на Loaded, а когда он приходит, применяем наши изменения, и отписываемся
Вот и вся логика
> Как до этого додуматься самому то?
Очень просто. Один раз сделать без этого, получить креш, задуматься о причинах :)
А с attached property — это известный трюк
Ещё есть attached behavior, более модная штука, забирайте в копилку
2
A: Обновление значения TextBox при нажатии кнопки "Enter"

VladDЕсли я правильно понял, необходимо, чтобы текст из TextBox'а «проваливался» в VM при нажатии Enter. Это как раз подходящее применение для attached behavior. Добавляем ссылку на System.Windows.Interactivity и пишем: class UpdateBindingOnEnterBehavior : Behavior<TextBox> { protected override v...

 
3:57 PM
Так, я тут
>Между какими? Вроде ж только один?
У вас один, но бывают у AttachedProperty их два
один называется ValueChanged, другой ValueUpdated. В чем разница, я хрен знает.
Еще мне интересно, при каких ситуациях OnMenuPlacementChanged вызовется. Я так понимаю, что это произойдет один раз, так как вы один раз устанавливаете значение Right и все. Но если бы вы изменяли его, где нибудь в коде и тд, то каждый раз вызывался бы этот обработчик
 
@Bretbas Хм, я знаю только один
А где их два?
То есть, где второй?
Сейчас поищу
 
Нет, их там два, точно:)
У меня ItemsPanelTemplate является StackPanel сейчас. Но пункты не растягиваются по ширине, а заполняют только область Header, которую имеют. Может быть это тупой вопрос, да, скорее всего тупой...Но я блин не могу никак найти, как сделать так, чтобы эти пункты по ширине заполняли ту область, какую имеет по ширине StackPanel
@VladD А здесь есть личка на SO?:)
 
для простых смертных нету
 
@Bretbas Я нашёл один в конструкторе PropertyMetadata
его зовут propertyChangedCallback
и он вызывается, понятно, когда dependency property (ну или attached property) меняется
 
Так, щас я уточню, где я это видел
и покажу
 
4:08 PM
@Bretbas А, это как-то делалось, момент
<Menu.ItemContainerStyle>
    <Style TargetType="MenuItem">
        <Setter Property="HorizontalAlignment" Value="Stretch"/>
    </Style>
</Menu.ItemContainerStyle>
Stretch вместо Center
@Bretbas Ага
 
UIPropertyMetadata принимает в первом параметре значение по умолчанию, во втором PropertyChangedCallback, и в третьем, о чем я и говоорил, принимает CoerceValueCallback
вот
 
@Bretbas А, это coercevaluecallback
Это другое
это callback, на котором мы можем «загнать значение в рамки»
 
Что это? Просто я смотрел видео, он обработчик назвал ValueUpdated
 
например
если мы хотим, чтобы юзер задал процент выполнения работы
от 0 до 100
а он вбивает, скажем 101
 
Когда он вызывается? Вместе с ValueChanged?
 
4:12 PM
то мы в CoerceValueCallback можем как бы привести к 100
то есть если у нас есть новое значение, то сначала оно проходит через CoerceValueCallback
который определяет, каким оно будет на самом деле с учётом наших пожеланий
а после этого оно таки присваивается свойству
 
Все, я Вас понял.
спасибо:)
 
и после этого вызывается PropertyChangedCallback
пожалуйста!
 
следующий вопрос:)
 
давайте :)
 
Как могут вообще устанавливаться какие-либо свойства( простые, или Attached property) у контрола, когда еще нет шаблона? Зачем это сделали?
 
4:14 PM
А очень просто
Вот у вас есть XAML
 
Вы сказали, что PropertyChanged может сработать, когда еще шаблон не прогрузился
 
@Bretbas Угу, не торопитесь
 
ок:)
 
Смотрите, сначала нужно построить дерево контролов
То есть прочитать XAML и создать на его основе контролы
Потом пробегают привязки и шаблоны
Стоп, назад
Только привязки
И стили
Потому что в стиле может устанавливаться шаблон
Ресурсы и всё такое
Они все пробегают до установки шаблона
Потому что они все могут повлиять на шаблон
Когда все привязки (Binding) разрешились, то пробегает создание шаблонов
а после этого отправляется Loaded
Значения attached property устанавливаются вместе с чтением XAML'а, до шаблонов
Это в случае, если они даны в XAML'е
 
понял
откуда такие знания?:) Вы работаете?
 
4:19 PM
А вот если они не в XAML'е, то тогда шаблон уже есть. Например, если вы установите значение из code behind, но не из конструктора
@Bretbas 10 лет в этой тематике уже
Ну хорошо, 7, не 10
Вот немного документации по теме: docs.microsoft.com/en-us/dotnet/framework/wpf/advanced/…
(на английском)
 
Мне 24 знания. С 19 лет сижу в тюрьме. Вначале не было ничего, не интернета, ни компьютера, ничего. Начал изучать C++ с нуля. Потом ООП. Потом начал в GameDev углубляться. Потом появился телефон с интернетом. Каждый день, я писал текстовые документы с вопросами, и ночью вставлял флешку в телефон и отправлял эти вопросы на форумы. Спустя 2 дня получал ответы. Потом постепенно появился интернет на компе... И с лета я начал изучать C#. Прочитал только одну книгу - Эндлю Троелсена. И вот я здесь:)
5 лет я в этой теме - толку 0:(
хочу также знать все...
 
@Bretbas Ого, ничего себе режим добычи знаний!
Мне ещё повезло с коллегами, наверное
 
А когда не было компьютера, я писал программы на паскале на листке бумаге
 
Ну вы спрашивайте тут, по многим темам найдутся спецы.
 
месяцев 5-6
 
4:24 PM
Я начинал с бумаги и Бейсика :)
Потому что компьютеры в школе были доступны редко
 
Да я уж понял. Я вначале на CyberForum'е был. Там как то слабо стали отвечать на вопросы. Долго ждать стал довольно
 
CyberForum? Я про них слыхал, но ни разу там не был
 
А на воле я нихрена не делал. Да, я знал азы линейного программирования - массивы, строки и тд. Но не ООП. А так дуренку гнал. Наркотики, бабы, тусовки...и вот я в тюрьме
решил взяться за голову тут
 
Ещё конечно стоит подучить технический английский, много информации есть на английском StackOverflow, там уже отвечено
 
Выучил английский немного, чтобы читать литературу на нем
я уже это сделал:)
 
4:26 PM
@Bretbas ничего себе немного :)
 
полгода, каждый день по 12 часов
он легкий довольно..правда говорить не могу на нем. Но читать более менее, особенно техническую литературу могу
 
@Bretbas Удивительно, кстати. Насколько я понимаю, немногие находят в себе силы взять себя в руки.
Удачи в вашем обучении!
 
Да я просто тупой на самом деле. Черт меня дернул с этими наркотиками связаться.
у меня красный диплом по среднеобразовательной
 
учиться никогда не поздно
 
286 балов по ЕГЭ за 3 экзамена
физика - 100 баллов
 
4:28 PM
@Bretbas Ого, неслабо!
Значит, потенциал есть, мозги на месте
 
суть в том, что мне скоро на волю, я конечно надеюсь, но я не знаю что делать
 
@Bretbas Добра пожаловать в программисты!
 
друг, с кем в сети познакомился за это время, говорит учить ASP.NET
А мне так C++ понравился, что я никак не могу от него отвыкнуть. C# намного слабее. Но суть в том, что программистом C++ нужно быть или очень крутым, или лучше быть программистом C#/Java и тд
 
@Bretbas Ну, я как человек, перешедший с C++ на C#, позволю себе не согласиться
У C# есть многое, до чего C++ ещё долго будет расти
Например: async/await.
 
там вроде есть std::async
правда я не пробовал их
 
4:31 PM
На C++ многопоточность с callback hell'ом
Угу, есть. Но он вроде не аналог
 
но если нужно, на C++ это можно реализовать. Как рефлексию, так и другое
Я не могу спорить
так как не щупал
на C# - async/await хорошая вещь
но на C++ есть шабллоны
очень крутая штука в правильных руках
по сравнению с C#, они очень мощные
и Java
 
Нууууу :) Рефлексию можно реализовать. Но придётся вместо нормальных свойств использовать собственные макросы (шаблоны не выйдет), и классы тоже определять не как попало. И это не будет работать для чужих классов.
Так что можно сказать, что настоящая, честная runtime-рефлексия невозможна.
Возможна compile-time рефлексия на TMP
 
Вроде QT реализовала нормальную рефлексию, нет?
 
С ужаснейшим синтаксисом
@Bretbas Для QObject — да. И его потомков. Путём добавления препроцессора.
А для std::string?
 
В принципе, она там и не нужна. Там о типе можно знать во время компилтайма
 
4:34 PM
@Bretbas Ну, эээ.
Тогда вот вам гипотетическая задача.
Нам нужно реализовать сериализацию объектов.
 
Ну да, маппер там будет намного сложнее реализовать, чем на C#:)
 
На C# это просто.
Берём, рефлексией пробегаем по дереву объектов, записываем все свойства.
На C++ как? Невозможно для чужих объектов.
 
C++ не даст такое сделать:) Я согласен:)
 
В свои можно впилить сотней макросов
Ну вот вам и необходимость рантайм-рефлексии
Затем
Сборщик мусора!
 
Я ему не особо доверяю:)
 
4:36 PM
Смотрите, вот вы хотите определить объект «Матрица»
@Bretbas Это зря :) Он хороший.
Итак, у нас есть объект «Матрица», и мы хотим реализовать операцию сложения
Matrix m1, m2, m3;
Matrix sum = m1 + m2 + m3;
 
ага
 
Если это C++, то придётся постараться
Объявлять матрицу на стеке — плохая идея
Потому что для возврата из функции придётся копировать
А это просто долго
Если матрица большая
Так что нам придётся либо работать с указателями на матрицы
Что создаёт отдельные проблемы
 
нет, стоп. Копировать уже ничего не придется. Так как появились rvalue ссылки
 
Это хорошо, если компилятор сможет соптимизировать
Но тогда нам нужно сколько операторов сложения?
Хм, нет, не помогут же?
Ну вот мы хотим реализовать оператор сложения матриц
Давайте прикинем его сигнатуру
Matrix operator+ (const Matrix& left, const Matrix& right)
правильно?
 
да
 
4:42 PM
То есть можно ещё определить три перегрузки с rvalue ref
rvalue ref слева, справа, и обе
это уже 4 оператора
 
итого 4
 
Угу
Теперь, это хорошо, если компилятор сможет оптимизировать возврат по значению
А если не сможет?
 
но можно сделать универсальные ссылки
 
Это ж не гарантировано
 
где T = Matrix
и тогда 1 оператор сложения, без репегрузок
для всех случает
 
4:44 PM
С этим пока не знаком, мой C++ застрял на C++11
 
Ну это появилось в 14 вроде
там работает правило свертывания ссылок, и тогда нужно один раз определить функцию и все
 
Окей, но даже если ссылка у меня универсальная, мне всё равно нужно отличать, имею ли я право стащить ресурсы или нет
 
и кстати, помоему сейчас, все компиляторы имеют оптимизацию при возврате из функции
чтобы не писали std::move
 
Ну это да, если такое возможно
 
return std::move(result);
 
4:46 PM
А вот вам пример, когда не выйдет:
 
:)
 
Matrix F(bool b)
{
    if (b)
    {
        Matrix m1;
        m1.DoSomething();
        return m1;
    }
    else
    {
        Matrix* pm2 = Matrix::CreateGlobal();
        pm2->DoSomethingElse();
        return *pm2;
    }
}
В этом случае оптимизация не получится, потому что компилятор просто не может сконструировать m1 на месте ответа
 
return *m2;
во втором случае копирование
Но вы явно это говорите компилятору, за счет разыменовывания указателя!
 
Ну окей, тогда так:
else
{
    DerivedMatrix m2;
    m2.DoSomethingElse();
    return m2;
}
Да, это слайсинг
Компилятор не знает, какой из конструкторов применять
 
можно ему помочь:) std::move)
в этом случае разрешено
 
4:52 PM
Или вот более простой случай.
 
:)
 
Matrix F(bool b)
{
    Matrix m1, m2;
    m1.DoSomething(m2);
    m2.DoSomethingOther(m1);
    return b ? m1 : m2;
}
Как его исправить?
 
Matrix F(bool b)
{
    Matrix m1, m2;
    m1.DoSomething(m2);
    m2.DoSomethingOher(m1);
    return b ? std::move(m1) : std::move(m2);
}
вот так наверное
 
Тут явно не получится RVO
Ну возвращаемый тип всё равно Matrix, то есть временное значение
То есть какое копирование мы соптимизировали?
 
И что? Мы создаем две локальных переменных. мы перемещаем одну из них в результат
без копирования
с std :: move мы вообще не копировали
мы переместили ресурсы в результат и все
 
4:56 PM
Хм. А ну-ка проэкспериментируем
 
компилятор есть под рукой?)
 
@Bretbas Ага
 
А как вы сделаете такую фишку без рефлексии на C#. К примеру есть класс, назовем его GameObject, который может хранить в себе объекты типа Component( и всех производных естественно ). Суть в том, что GameObject является фабрикой этих объектов, имея при себе методы addComponent<T>/removeComponent<T>, где T - Component*. Все типы, производные от Component, могут иметь разные конструкторы( с разными параметрами, или вообще без параметров ). Как сделать такое на C# без рефлексии? :) Никак.
на C++ можно. И довольно легко. Причем опять без копирования параметров внутрь конструкторов этих производных от Component классов
Я вам скажу вот что. Какие бы Вы не придумали, в данное время примеры, которые могут привести к утечки памяти, или лишнему копированию, на Ваш взгляд, сейчас этого просто невозможно на C++. Его настолько переделали в 11/14/17 стандартах, что это совсем новый язык, по сравнению с 03...
 
Какой дикий мердж коллекции с фабрикой) Зачем коллекции знать что-либо о конструкторах компонентов?
 
Хм, и правда переместило. Сейчас придумаю пример посложнее.
 
5:07 PM
@vp_arth ей и не надо знать ничего о конструкторах
 
@Bretbas таки нафига ей рефлексия?
 
кому?
 
GameObject, вестимо
 
@VladD Ок:)
@vp_arth на C# пришлось бы применять рефлекцию, для создания экземпляра типа T, с параметрами
типа такого
		T AddComponent<T>( params object[] args ) where T : Component
		{
			return (T)Activalor.CreateInstance( typeof(T), args );
		}
+ ко всему, ошибка во время выполнения если неправильные параметры передать
А вот C++:
template<typename T, typename... Args> T* addComponent( Args... arg )
{
return new T( std :: forward<Args>( arg )... );;
}
Нет рефлексии, все во время компиляции провериться. и типы и все
и нет копирования
 
С таким кодом непонятно, зачем вам вообще типизация)
 
5:18 PM
С типизацией нет никаких нарушений. Все строго типизировано. Если будут какие-либо неправильные типы подставлены в Args... arg при передаче в конструктор, выдаст ошибку во время компилтайма.
А вот в C# во время выполнения...
@VladD блин, я что то задал стиль для MenuItem, но Popup как был таким же, так и остался. Белый фон я имею ввиду.
				<Menu.ItemContainerStyle>
					<!-- центрирование элементов -->
					<Style TargetType="{x:Type MenuItem}">
						<Setter Property="HorizontalAlignment" Value="Stretch"/>
						<Setter Property="HorizontalContentAlignment" Value="Center"/>
						<Setter Property="Background" Value="{StaticResource BackgroundMediumDarkBrush}"/>

					</Style>
				</Menu.ItemContainerStyle>
Stretch - вытягивает их по всему StackPanel, это да. Но теперь Header каждого MenuItem смещен по левому краю
хотя я у свойства HorizontalContentAlignment, как Вы видите, установил Center
 
Окей, я нашёл случай, когда без copy constructor'а не обойтись
У нас может быть глобальный объект
Ну и если мы его возвращаем, то нам понадобится таки копия
Но это отдельный случай, конечно
с глобальным объектом просто нельзя использовать std::move
нормальный случай: у нас есть преаллоцированная единичная матрица
если мы её возвращаем, то нам приходится её копировать
для случая локально созданных объектов компилятор стал умный, особенно если ему подсказать с std::move
но с глобальными объектами он не сможет ничего сделать
окей, с этой частью понятно
да, ещё одна штука, которой нет в C++ и вряд ли будет: LINQ.
ну ладно, это всё лирика
@Bretbas ну вот, придумал же
 
5:34 PM
так ща
 
@Bretbas Ну это да. Perfect forwarding и всё такое.
Конструктор спроксировать нельзя.
Но это обычно лечится очень просто:
Не AddComponent<T>(Arg1 arg1, Arg2 arg2, ...), а AddComponent<T>(T t) where T: Base
В C# смысла в проксировании конструктора нет
Да, ещё одна фишка C#: замыкания
Ну то есть в C++ они формально есть
Но именно что формально.
Потому что если я построю замыкание по локальной переменной, и запомню результат в поле класса, можете себе представить, что будет
 
Ну с глобальным объектом, это уже другая тема...если мы его хотим вернуть его из функции, то конечно же будет копирование, так как объект находится на гглобальном уровне
но это пример, который почти никогда не может произойти, в нормальных проектах
>Потому что если я построю замыкание по локальной переменной, и запомню результат в поле класса, можете себе представить, что будет
ну да
 
@Bretbas Ну почему же, у меня в коде на C# Matrix.Unit используется достаточно часто
 
там надо быть аккуратным
 
@Bretbas Не то слово — аккуратным.
 
5:38 PM
> Ну почему же, у меня в коде на C# Matrix.Unit используется достаточно часто
 
И компилятор предупредить не сможет
 
ну тогда возвращай Matrix&
 
@Bretbas Ага, а если иногда нужно вернуть локально вычисленный объект, а иногда — Unit?
Ссылку на локальный объект вернуть не получится
А сборщика мусора нет
if (cond) return Matrix(...); else return Matrix::unit;
 
>Ссылку на локальный объект вернуть не получится
получится
если вернешь const Matrix&
 
@Bretbas А мне нужен не конст
Возможно?
 
5:41 PM
да
 
Возможно
 
тогда можно снять const
:)
после получение результат
результата
 
И UB?
Потому что объект-то сдох
 
нет
 
Вместе с фреймом
 
5:42 PM
все номрально будет
 
Эээ... А можно код?
 
ща
Я правда так никогда не делал, но знаю можно
 
const Matrix& F() { if (cond) return Matrix(...); else return Matrix.unit; }
так?
 
const char *str = "hello";
char *str1 = const_cast<char*>(str);
 
это грохнется на попытке модификации
потому что литерал защищён реально от записи
сейчас перепроверю
Грохнулось
 
5:46 PM
ща стой
 
Ну, "hello"-то реально const-объект
а снимать const можно только с тех, кто не const в реальности
 
да, да:) Я понял. Неудачный пример
ща может поищу, что то на эту тему
 
Ну если создать объект наподобие return Matrix(...);, то он реально не const
ну допустим, что мы написали снаружи
const Matrix& m = F();
Matrix& m2 = const_cast<Matrix&>(m);
Но время жизни этого объекта теперь ограничено временем жизни ссылки m
И когда m выйдет из scope'а, объект сдохнет, верно?
А если мы хотели вернуть его из этой функции наружу?
 
ага:)
 
то есть мы подставляем костыли, и нужно всё время помнить об этом, чтобы не грохнулось
в C# всё же таких проблем меньше
вот когда ещё non-nullable references появятся, будет вообще хорошо
 
5:53 PM
это наверное единственный пример:) И я думаю он решаем. Просто я не знаю:)
 
@Bretbas Хм, я поэкспериментирую дома
Сейчас нужно уже валить с работы
 
Ок. Стой:)
ты мне скажи
<Menu.ItemContainerStyle>
<!-- центрирование элементов -->
<Style TargetType="{x:Type MenuItem}">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="Background" Value="{StaticResource BackgroundMediumDarkBrush}"/>

</Style>
</Menu.ItemContainerStyle>
выравниваются теперь по левой стороне Header'ы почему то
и Popup такого же убогого цвета:(
 
Ну это надо snoop'ом посмотреть
 
тоесть должно быть все нормально?
 
А, стой
Ну поставил ты background у ItemsContainer'а
А сами Item'ы небось тоже непрозрачные
и своего какого-то цвета
вот его надо тоже перекрыть
 
5:56 PM
<Setter Property="Background" Value="{StaticResource BackgroundMediumDarkBrush}"/>
вот я его ставлю же?
 
а у тебя Snoop есть?
 
нет
 
Необходимейшая вещь
Ты можешь поэлементно посмотреть, кто какого цвета и размера
 
это для отладки?
 
@Bretbas Нееее
Это для ItemContainer'а
А в нём лежат Item'ы
Сверху
Какого-то своего цвета небось
А подкладки вовсе не видно
Может быть?
Может
 
5:59 PM
<Menu Grid.Row="2"
VerticalAlignment="Top"
Background="{StaticResource BackgroundVeryDarkBrush}"
Foreground="{StaticResource ForegroundLightBrush}">
<Menu.ItemsPanel>
<!-- вертикальное расположение для меню верхнего уровня -->
<ItemsPanelTemplate>
<StackPanel/>
</ItemsPanelTemplate>
</Menu.ItemsPanel>
<Menu.ItemContainerStyle>
<!-- центрирование элементов -->
<Style TargetType="{x:Type MenuItem}">
<Setter Property="HorizontalAlignment" Value="Stretch"/>
<Setter Property="HorizontalContentAlignment" Value="Center"/>
 
06:00 - 18:0018:00 - 21:00

« first day (842 days earlier)      last day (2189 days later) »