« first day (843 days earlier)      last day (2188 days later) » 
03:00 - 16:0016:00 - 23:00

3:14 AM
@VladD например, перебор дочерних контролов в контейнере. Например, если у нас в гриде лежит 2 контрола в одной ячейке, то тот, что ниже объявлен, он будет сверху. Можно ли на это рассчитывать?
Хочу сделать что-то вроде автогрида, чтобы в дочерних контролах вместо указания конкретной строки Grid.Row="2" можно было указать, например, local:GridEx.Row="Next" или local:GridEx.Row="Current" и чтобы это АР мне автоматом проставляло АР Grid.Row
 
 
1 hour later…
4:38 AM
Через АР сделать это пока не удается, похоже надо наследоваться от грида
 
 
6 hours later…
11:08 AM
@Андрей из отрывочного контекста беседы непонятно что вы изобретаете. Что-то похожее на это? catelproject.atlassian.net/wiki/spaces/CTL/pages/1409037/…
 
@vitidev да или такого: github.com/JohanLarsson/Gu.Wpf.AutoGrid
 
12:00 PM
может действительно будет лучше добавить <EmptyRow /> с возможность задать высоту чем дополнительное свойство?
 
12:25 PM
@FoggyFinder неа, будет у меня 50 строк и мне придется добавить 50 49 EmptyRow
 
@Андрей а когда такое в принципе может быть нужно?
 
@FoggyFinder когда у меня нечто похожее на окно Properties
 
@Андрей Порядок Child'ов? Он должен соответствовать текстуальному порядку вне зависимости от того, как читается документ.
 
если бы у меня было 5-10 строк, то я вообще бы ни с чем не заморачивался - сделал бы всё штатными средствами, но когда у меня уже пару десятков строк - хочется выкинуть лишнее
 
@Андрей Ну так за пол-пирожка же! Нужно навесить AP LastRowAllocated
 
12:32 PM
@VladD не понял
 
@Андрей Ну, заводите AP LastRowAllocated со значением по умолчанию 0.
И ещё AP GridEx.Row. Которое при установке будет смотреть на LastRowAllocated и, возможно, увеличивать его
Хотя не, плохо.
Тогда не так.
Нужно найти всех Child'ов того же уровня с тем же атрибутом
 
@VladD ну я утром часик поковырялся - не получилось, там какие-то конфликты полезли, некогда было разбираться. Примерно так и пробовал сделать
 
И переустановить значения
Я бы сделал не так, лучше написать свой GridEx : Grid
И переопределить ArrangeOverride
А в нём поразвешивать Grid.Row и вызвать стандартный Grid.ArrangeOverride
Как-то так
 
12:47 PM
@VladD мда, здесь вообще другой подход: github.com/JohanLarsson/Gu.Wpf.AutoGrid/blob/master/…
вообще в виде расширения разметки сделано
которое потом создает Grid
 
@Андрей Чёта слишком сложно
А ну попробую налабать, момент
 
У Catel сделано наследование, но исходники пока не могу найти
 
Вопрос, сколько гб может обработать C#
 
@webstackoverload ∞
2
что за вопрос вообще такой?
 
1:03 PM
стримом кусать ?
 
@webstackoverload ГБ чего и что значит обработать?
 
1 гб текстовый файл - обработать - это допустим заменить строку, во всех содержащихся строках
Тут есть ТЗ, текстовое, написать обработчик
 
построчно читайте, хоть 150Гб, ну если строчки, конечно, не по пару гигов длиной
 
Ну делайте построчно, в чём проблема? Вас же никто не заставляет читать весь файл в память.
 
File.ReadLines отлично подойдет
 
1:11 PM
@Андрей Понял, нет рид лайн не думаю вот стримером да
А что посоветуйте по поводу многопоточности ?
Какой метод будет самый эффективный для работы с HTTP
в многопоточном режиме
 
1:57 PM
@webstackoverload Почему нет?
 
потому что не File.ReadLines, а StreamReader.ReadLine ()
 
А зачем вам StreamReader? У вас файл?
 
Имена методов и классов с большой буквы - это плохо продуманный дизайн или злой умысел?
 
@VladimirGamalyan это отличное решение
 
@vitidev для любителей лишний раз shift вдавить, наверное да
 
2:03 PM
@VladimirGamalyan я пишу на 6 языках и имхо каждому языку свое. Я видел примеры "я люблю так везде делать" и оно выглядит ужасно.
 
@vitidev ну чтож, с такими аргументами не поспоришь
 
У меня возникает желание выбросить _ из имен переменных, а вот менять регистры слов не возникает. А должно было бы по идее если бы регистр был для конкретного языка неудачным. Просто реально легче читается. В пхп вот легче читается camelCase. В питоне и руби все плохо читается из-за их _
 
@VladD А вы не в курсе плюшек от клацания шифта перед каждым словом?
 
в курсе. читать легче. глазу легче цепляться за "маркеры". К тому же это происходит только при наборе нового кода, а при вызове чужих методов этим не страдаешь. А уж имена классов с большой так вообще много где и это удобнее
Один раз пишем - миллиард раз читаем, не забывайте
 
@VladimirGamalyan фишка в том, что достаточно набрать только заглавные буквы, причем можно прямо в нижнем регистре, а студия уже дополнит сама
 
2:12 PM
@Андрей Вот это уже другой коленкор.. Т.е. всё ради сокращений? Хотя стоп. А что мешает со строчной начинаться именам?
@vitidev Для меня сложность прочтения между fooBar и FooBar одинакова.
 
Если вам надо набрать AqwertyBqwertCqwertyDqwertyu, то просто наберите abcd и нажмите, например, пробел
Ну тут дело не в том, что мешает, просто я говорю, что шифт не нужен
 
это вам нужно в руби заглянуть с их "зачем писать всякие скобочки" и так хорошо заглянуть чтобы понять насколько проще читать спецсимволы чем слова. После этого я не экономлю ибо чтение на 1000 порядков чаще происходит. чем набор. К тому же можно набирать хоть в кэмелкейс и потом решарпер сам поправит если уж совсем лениво
 
@vitidev именно
 
@VladimirGamalyan Не вполне понял, перед каким каждым словом?
 
@Андрей А тем бедолагам, у кого не разворачивается пробелом..
 
2:16 PM
Так что по поводу многопоточности ?
Скажу сразу, особо не копал
 
@VladD В методах/классах нетовских
 
@webstackoverload HttpClient же. один инстанс на все запросы. самое оно
 
@VladimirGamalyan Это стандарт :) На мой вкус, лучше, чем snake_case
 
@VladimirGamalyan Поставить студию и не выёживаться ;)
 
@vitidev Меня интересует именно эффективность
А не просто реализация
 
2:18 PM
@webstackoverload ответ тот же.
 
@VladD снейк - тоже лишние нажатия, мне интересно почему не camelCase со строчной.. (как самый легко набираемый)
 
@vitidev Тогда понял. Спасибо
 
@VladimirGamalyan Чтобы отличать от переменной? Классы всё же.
 
@VladD Ок, для классов понятно. А что с методами?
 
Чтобы отличать от переменных?
 
2:19 PM
@VladD скобочек не хватает? Или уже можно без скобок, как в D
 
@webstackoverload вот если вы будете плодить по инстансу на запрос - тут все будет плохо. Там ниже по уровню сокеты уже не помню чего
 
Здарова всем
 
@VladimirGamalyan Action action = DoSomething; action();
@Bretbas Здрасте! Я там пофиксил баг в коде, который я же стащил с en.SO
 
Да какая разница, в конце концов? Главное привыкнуть, потом по-другому и неудобно
 
@vitidev Да я ресерчем займусь на эту тему, вечером, требуется четкая проработка многопотока.
 
2:20 PM
@VladD Вот это чё щас было. У меня шарп на уровне хеловорлда. DoSomething; - это вызов метода?
 
@VladD что за баг? Про Popup?
 
@VladimirGamalyan делегаты
 
@VladimirGamalyan Шапр почти как PHP по синтаксу, легкий (по крайней мере для моего понимания) в отличии от С++
 
@VladimirGamalyan В шарпе переменную можно тоже вызывать как метод без скобок, а метод наоборот использовать без скобок, чтобы присвоить переменной
 
Вот Питон, это вобще, как будето статью пишеш )
 
2:21 PM
@VladD Вопросов больше не имею. )
 
@Bretbas Ага, там attached property не работали во внутренних контролах
 
@VladD ща посмотрю
 
@VladimirGamalyan Action — это типа функции без аргументов
Которую можно записать в переменную
и потом вызывать через ()
 
Чат живой. Вы тут о чем?:)
 
2:23 PM
@vitidev thanks занес в фавориты
@Bretbas Вливайся в канал )
 
@webstackoverload еще может быть проблемой любовь шарпа резолвить днс в потоке вызова. Из-за этого я стартую запросы в отдельном Task.Run().
 
Ох, вышла студия 15.5
С C# 7.2
Сегодня
Скачиваю, ставлю :)
 
@VladD что нового в нем добавили?
 
@vitidev Мне все равно нужно будет читать об азах, а потом уже займусь реализацией, в общем я знаю как работать но детали + я не кодер на шарпе, так пару мелких проектов было когда-то :)
 
2:25 PM
@VladD вроде уж неделю как? Или там что-то другое прилетало?
 
ref readonly, для любителей пожертвовать семантикой для производительности, и програмистов игр
 
Будем устранять по мере поступления
 
@Андрей Неделю назад была 15.4.5
 
@VladD а, наверное
@VladD private protected? Хм, это что?
 
Reference semantics with value types уже давно в C++
 
2:28 PM
@Bretbas Угу, const T&
 
for( const auto&& elem : arr )
 
В C# раньше не было, т. к. грязная семантика
 
@VladD ага
 
Сейчас уступили разработчикам игр и добавили
Кто сможет сходу назвать пример, когда есть разница?
 
Non-trailing named arguments не особо полезно, я вообще эту тему не использую..
 
2:30 PM
@Bretbas Зря, очень помогает, кстати
 
@VladD а мне кажется загрязняет код
 
Если аргументов несколько, то не упомнишь, где длина, где ширина, а где высота
А так он получается самодокументируемым
SetDimension(width: 5.0, length: 2.0, height: 10.0) лучше же, чем SetDimension(5.0, 2.0, 10.0).
 
Метод сам говорит о себе
название его
вообщем, это дело вкуса...мне не нравится:)
Leading underscores in numeric literals вот это нормальная тема. Удобно
 
Или вот читаем код: await task.ConfigureAwait(true). Хорошо?
Что означает true?
А вот await task.ConfigureAwait(continueOnCapturedContext: true) лучше
 
@VladD :)
 
2:34 PM
@VladD так это же давно есть
 
@Андрей Да.
 
Вообщем не особо они много добавили...
 
Но теперь именованные аргументы не обязательно в конце
Ну для минорной версии нормально
А кто знает, что такое Span<T>?
Там на самом деле реально много под капотом.
У них появились stack-only-типы
С flow-анализом и всеми делами
 
@VladD ну да, единственно полезное это Reference semantics with value types
остальное для красоты в основном
 
@Bretbas Ну раньше можно было тоже передавать как ref.
Но теперь ref readonly создаёт видимость безопасности
Если они встроят const_cast, я застрелюсь
Ну что, кто-то придумал пример отличия ref readonly от передачи по значению?
(Без многопоточности)
 
2:40 PM
>Ну что, кто-то придумал пример отличия ref readonly от передачи по значению?
в плане?
очевидно же, нет?
 
лучше бы они потянули и сделали бы System.ValueTuple.dll не как отдельную длл. а теперь таскай ее до скончания времен
 
@vitidev Поставьте .NET 4.7
 
стоит. но это не помогает если какя то либа из nuget тащит за собой System.ValueTuple из nuget
 
void f(int x, Action a) { a(); Console.WriteLine(x); }
int x = 1; f(x, () => x++);
@vitidev Ну так она тоже пусть перейдёт на 4.7
 
@VladD ну так это сделать? никак. вот автор либы считает что поддерживать надо фреймворки ниже 4.7 и не видит смысла собирать отдельный билд под 4.7. В итоге это навечно
 
2:44 PM
@vitidev Ну, а есть авторы, которые считают, что генерики — изобретение дьявола, и сидят на .NET 1.0.
Динозавры не нужны!
Попросите его вежливо.
 
@VladD если дженерики - изобретение дьявола, то что они скажут про шаблоны и макросы C++:)
 
@Bretbas Макросы — изобретение дьявола для тех, кто не может в нормальную кодогенерацию :)
(Я имею в виду их единственное валидное применение в C++)
Кстати, коллеги, есть ли в каком-то ещё языке аналог partial-классов?
Для кодогенерации самое оно.
 
в руби
 
Правда? Круто, не знал.
Уважаю.
 
и радуйтесь. из-за этого только сплошные беды
 
2:48 PM
Почему беды? Офигеннейшая фича же.
Что может быть не так? (ц)
 
Хм, readonly struct, когда readonly class будет или он теперь не нужен?
 
@VladD >С этим кодом attached property можно навесить не только на «Панно», но и на «Полтавскую баталию».
Так у меня и спредыдущим кодом можно было навесить на любой пункт
 
Потому что в руби она возведена в абсолют. Каждый считает нужным расширить класс тонной хлама. В итоге невозможно понять что в итоге там будет, потому что определение класса размазано по сотне мест + кто угодно может добавить куда угодно чего угодно и .... делают это без меры
 
@Bretbas Можно. Но не работало :)
 
наконец то сделали refine - аналог local extensions methods в шарпе....но толку то - тонны старого кода никуда не делись
 
2:51 PM
Как не работало
 
@vitidev манки патчинг?
 
у меня работало все
@VladD у меня работало
 
@Bretbas У меня нет, в заглавном же примере, если повесить оффсеты на баталию
попробуйте!
выравнивание вправо работало по другой причине
 
@VladD Я оффсеты вообще не брал пока что. Брал только PlacementProperty
 
потому что это дефолтное поведение
поэтому баг был не заметен
 
2:53 PM
@VladD как основное средство расширения класса. Но мы говорим о написании класса, а не о расширении в рантайме. Так вот руби позволяет расписать класс как partial и этом в либах активно пользуются, что жутко мешает.

Я если пишу на руби то пишу в стиле "делегируй, ане расширь", но в итоге просто стараюсь не писать вовсе.
 
@vitidev то есть это расширение в рантайме?
потому что в C# partial — compile-time feature
А манки-патчинг зло, конечно, см. JS
 
@VladD нет. там есть и "compile-time" - полный аналог partial и манкпатчинг когда сторонние либы расширяют ваши классы в рантайме и это в руби норма. и это основная беда руби.
 
@VladD суть в том, что если сделать HorisontalContentAlignment =strech, то пункт меню растягивается по всему StackPanel, где он находится. Если пункт имеет подпункты, то при нажатии на него, он показывал Popup ровно справа, относительно пункта. Так что attachedproperty с выравниванием даже не пригодилось
 
@Bretbas Угу, это да
Но если попробовать оффсеты, то видно, что они не работают на вложенных уровнях
А значит, и Placement не работает тоже
 
@VladD да как не работает, когда работает:)
@VladD скинуть скрин?:)
 
2:59 PM
@Bretbas ну мне ж лучше знать :) если поставить Placement=Bottom, тоже работает?
 
Ща проверю
@VladD точно. Для вложенных пунктов у подпунктов не работает. По стандарту - вправо:)
 
@Bretbas Воооот!
 
@VladD извини. Не понял, что конкретно просто вы исправили:)
 
А с новым кодом — работает.
Кстати, мы на вы или на ты?
 
@VladD можно на ты:)
 
3:02 PM
@Bretbas Значит, на ты :)
Заодно выкинул некрасивый код с подпиской, и вынес его в таск. Теперь выглядит намного изящнее
 
@VladD А что скажешь по поводу изменения вида Popup? Цвета его? У меня почему-то не получается изменить его Background. Я пытался сегодня написать AttachedProperty, которое изменяет его цвет, но заметил, что у Popup'а вообще нет таких свойств как Foreground/Background...
 
@Bretbas Не-не, попап трогать не надо, он же просто окно
Нужно менять стиль MenuItem'ов
 
@VladD Я меняю...и толку ноль
 
А что нужно получить? Есть картинка?
 
@VladD ща, я вначале разберусь с кодом, который ты представил, чтобы понять его. И потом уже перейдем к другому
 
3:05 PM
Ща у меня Студия доинсталлируется, и попробую написать
 
@VladD а то, я так запутаюсь
 
@Bretbas Угу, давай
Ага! Ещё появился Span<T> и слайсы.
Для любителей чистого C
 
@VladD // если причина в том, что родитель закрыт, подождём пока откроется
 
@Bretbas угумс
 
че то я некоторые вещи не понимаю
 
3:12 PM
родительский элемент может ещё не раскрыться, а Loaded уже отработает
 
Он же вообще может не раскрыться?
 
это да
 
что ты понимаешь под "Раскрыться"?
 
тогда этот метод будет висеть вечно :-\
надо бы пофиксить
 
вот
 
3:13 PM
Ну смотри
 
я о том
 
Когда у Полтавской баталии приходит Loaded, Панно может быть ещё не раскрыто
У меня обычно так и бывает
И при этом Template в баталии не применён, а значит, FindName возвращает null.
 
стоп
 
Позже элемент раскроется, Template применится, а наш код уже отработал
 
if (!menuItem.IsLoaded) // не загружен => дожидаемся
    await TillEvent(h => menuItem.Loaded += h, h => menuItem.Loaded -= h);
 
3:15 PM
(это со старым кодом)
угу
 
мы ждем пока будет загружен
 
Когда у Полтавской баталии приходит Loaded, Панно может быть ещё не раскрыто
И у Баталии ещё не применился Template
Понимаешь?
 
если у Полтавской баталии приходит Loaded, значит этот код проходим мимо:
if (!menuItem.IsLoaded) // не загружен => дожидаемся
    await TillEvent(h => menuItem.Loaded += h, h => menuItem.Loaded -= h);
затем
пытаемся получить Popup
Popup popup = (Popup)menuItem.Template.FindName("PART_Popup", menuItem);
 
Да, и он null
может быть
 
если мы не можем это сделать у Полтавской баталии
то
(popup == null)
 
3:18 PM
угу
 
затем мы получаем родителя, а именно Панно
var parent = menuItem.Parent as MenuItem;
 
и тогда мы дожидаемся, пока раскроется родитель
@Bretbas да
 
Вот стоп
теперь
if (!parent.IsSubmenuOpen)
 
угу
идея вот какая
 
Как он может быть не раскрыт, если мы нажали на Полтавской баталия, значит он в любом случае раскрыт
 
3:19 PM
Неееее! В том-то и дело
 
у Полтавской баталия свои подпункты
е-мое
 
Loaded на Полтавской баталии приходит при нераскрытом Панно
Не знаю, почему
 
тоесть это все грузится перед исполнением программы, так?
 
@Bretbas Вот тут не понял
 
Ну я так понимаю, что AttachedProperty выполняет свой ValueChanged, не тогда когда я нажимаю на пункт, который имеет AttachedProperty, а при заведении программы?
 
3:22 PM
Ну, attached property меняет значение в двух случаях:
Когда происходит разбор XAML'а
(То есть, в конструкторе окна/UserControl'а)
И когда оно меняется вручную или через Binding
 
так, теперь подожди
 
жду
 
Еще раз, допустим сейчас сработало ValueChanged у пункта Полтавской баталия и Loaded произошел у него, но Popup'а еще нет. Ты мне вроде говорил что так может произойти, блин, я забыл почему:(
как может быть так, что loaded произошел у пункта, а popup'а еще нет?
 
@Bretbas Я не знаю точно, обычно такого не бывает. Но вот правдоподобный пример.
Например, Панно создаёт свои child-объекты в нычку, без контента
А даёт им контент только в случае, когда оно раскрывается
Это полезно для случая, когда никто не будет раскрывать меню — не нужно и создавать child-элементы
Наверное, это причина
 
но тогда
    if (!menuItem.IsLoaded) // не загружен => дожидаемся
        await TillEvent(h => menuItem.Loaded += h, h => menuItem.Loaded -= h);
мы всегда будем ждать
 
3:27 PM
В любом случае оказалось, что Loaded приходит при закрытом Панно, и попапа нет
@Bretbas По сути не всегда.
 
не могу понять, как это может быть:) хоть убей
>По сути не всегда.
 
Если attached property навесить не из XAML'а, а из кода, потом.
То в этой точке IsLoaded = true уже
Или поменять его значение через Binding
 
>То в этой точке IsLoaded = true уже значит и popup есть уже!
 
Вот, в этом и засада: у нас по факту (и это реально происходит со старым кодом) IsLoaded = true, а попапа нет.
 
это бред, но почему так происходит?:) Значит popup создается во время нажимания на пункт?
 
3:31 PM
И я не смог найти, к чему прицепиться, чтобы точно узнать, когда же реально появится содержимое темплейта
@Bretbas Судя по всему, да — при появлении пункта меню на экране
Надеюсь, что только при первом
И из-за этого и был баг
 
Не может Popup создаваться тогда, когда я нажимаю на пункт? Допустим во время Loaded его нет, и после этого тоже нет. Но вот когда я нажимаю на пункт Панно, то создается Popup? Может так?
 
Да, именно так
 
зачем тогда пописываться на Loaded?:) Может подписаться на Click?
 
Если нажать на Панно, то появляется Полтавская Баталия, и в этот момент создаётся у неё попап.
 
е-мое
 
3:34 PM
@Bretbas А потому что Панно уже развёрнуто :)
 
Popup относится к Панно или в Полтавская Баталия в данном случае?
 
Попап принадлежит Полтавской баталии
 
да как такое может быть?
 
И он создаётся, когда баталия появляется на экране
 
Давай еще раз, смотри
 
3:35 PM
А это происходит при раскрытии Панно
Давай
 
а у Панно тоже есть popup получается?
 
Да.
Но Панно видно с самого начала
Поэтому попап там есть
Но не сразу
 
ага:)
 
А после Loaded
 
Вот!
стоп теперь
 
3:36 PM
Стою
 
    if (!menuItem.IsLoaded) // не загружен => дожидаемся
        await TillEvent(h => menuItem.Loaded += h, h => menuItem.Loaded -= h);
    Popup popup = (Popup)menuItem.Template.FindName("PART_Popup", menuItem);
    if (popup == null) // нет ещё попапа?
зачем if (popup == null)
если после Loaded он уже есть
 
У Полтавской Баталии нету
А у Панно есть
Потому что Полтавская баталия скрыта, а Панно нет
 
ну когда Loaded у полтавской баталии пройдет, то и будет popup? Нет?
 
Нет, Loaded у неё происходит в начале, тогда же, когда и у Панно
То есть я думал, что после Loaded темплейт есть
 
а popup создается, когда мы видим пункт на экране?:)
я понял
 
3:38 PM
фигушки, для невидимого элемента нету
@Bretbas да
Но я не знаю, можно ли на этом основываться
 
все, этот момент я понял, теперь дальше
 
Окей, поехали дальше
 
а дальше все понятно теперь
:)
 
Вот :)
 
мы ждем пока пункт покажется на экране, и тогда popup точно будет
 
3:40 PM
Единственный баг — это функция TillEvent, которая может ждать вечно
Это можно подправить
@Bretbas Угу
 
А может есть событие? Shown или Display
для пунктов
ща посмотрю
 
@Bretbas Если есть, хорошо, но я чёта не нашёл
 
IsVisibleChanged? Не то, да?
 
@Bretbas Хм, а фиг его знает, надо проверить
Работает ли там Visible, или мимо него
 
Ладно, я ща напишу у себя это все. А то это все теория была. Ща проверю все у себя. Может че похимичу
 
3:44 PM
Ага
 
А в принципе, зачем нам нужно вообще на каждый пункт , который имеет подпункты, attachedproperty, которое изменяет placement у popup'а? Я думаю, что это нужно вывести на уровень выше, повесить свойство на контрол menu, и при ValueChanged, будет искать дочерние контролы, а именно MenuItem, у них все пункты, у которых есть подпункты, искать у этих пунктов Popup'ы, устанавливать placement, и дальше рекурсивно проходить вниз по дереву.
Если мы установили MenuPopupPlacementAttachedProperty="Bottom" - то пусть это для всего меню в целом работает
и тогда задача намного легче становится
@VladD согласен?:)
 
@Bretbas Хм.
А в какой момент оно будет обходить?
Если в момент изменения AP, то попапов может ещё и не быть
А так вообще-то конечно, было бы неплохо.
Но AP можно определить в стиле, кстати
 
что такое АР?
Ж)
:)
 
Attached property
 
мне кажется так будет лучше?:) Если подумать слегка?:) Я подумаю сам. Не пиши
суть в том, что я не могу вид изменить этого popup'а. вот это внатуре проблема. Я уже все свои силы истратил на это, но так и не понял, как изменить его
 
3:55 PM
@Bretbas Угу, попробуй. Мне кажется, нужно будет подписаться на раскрытие всех элементов поддерева
 
ага
 
@Bretbas А, ну этим сейчас займёмся :)
 
submenuopen
Я как раз когда увидел это событие, у меня сразу в голову эта идея пришла:)
 
Для полноты реализации нужно позаботиться и о том, что элементы могут создаваться динамически
Например, через ItemsSource
MVVM и все дела
 
Слушай, мне нужно отойти минут на 30. Хренью какой-то озадачили, надо срочно сделать...ща минут через 30 приду
 
3:57 PM
Угу, давай
 
MVVMC получше будет.
 
03:00 - 16:0016:00 - 23:00

« first day (843 days earlier)      last day (2188 days later) »