« first day (844 days earlier)      last day (2187 days later) » 

5:37 AM
>Окей, вот что эта штука не поддерживает: добавление и удаление элементов меню.
Можно сделать еще одно attachedProperty - MonitorMenuChangedAttachedProperty, которое будет подписываться на событие MenuChanged нашего menu. Как только меню изменилось( добавился/удалился элемент MenuItem ), мы может программно выполнить апдейт MenuPopupPlacementAttachedProperty. И все, цепляем это MonitorMenuChangedAttachedProperty свойство на меню и радуемся. Это свойство даже дает некоторую гибкость в том, что можно включить или отключить возможность давать изменять Placement у popup
для тех пунктов, которые добавились позже, динамически
 
 
8 hours later…
2:02 PM
@Bretbas Ну, случаев, когда можно игнорировать новые элементы, практически не бывает. Так что я бы не делал ещё одно AP, а просто встроил бы в существующее поведение. А так да, если не нужно иметь разные значения для разных элементов, то почему бы и не сделать проще.
 
2:15 PM
@VladD спасибо, круто
Я бы АР Location сделал enum, что-то типа public enum Location { Manual, Current, Next }
В этом случае студия давала бы подсказки при наборе разметки
Ну и при if (currRow >= rows) добавлять в грид новые строки, тогда RowDefinitions можно вообще не писать
 
2:32 PM
@Андрей Да, вполне можно
Чтобы была подсказка Intellisense
Я как-то такое делал
@Андрей Или раз у нас уж новый класс, то можно положить DP Rows / Columns
и создавать их в ручную
тут вопрос вот какой:
если next выходит за границу, добавлять новый столбец или новую строку?
@Андрей пожалуйста!
 
@VladD в моем представлении были только строки автоинкрементируюшиеся, а номер колонки вручную. В вашей реализации не понятно, но как по мне логичнее добавлять строку все же
@VladD да кроме энума ничего и не надо в принципе, студия достаточно умная для этого :)
 
Здарова всем
 
@VladD это у меня есть уже:
Dec 2 at 20:16, by Андрей
я тут себе набросал за 20 мин: https://pastebin.com/NmKra3dx
 
2:50 PM
@VladD А не подскажешь, как можно вытащить из Menu дочерние MenuItem? Когда статическое меню делаю, то при случае menu.Items - это свойство выдает коллекцию дочерних MenuItems, а вот когда подсоединяю через Binding коллекцию из VM, то menu.Items содержит элементы коллекции из VM, тоесть уже не коллекцию MenuItem'ов. Как получить дочерние MenuItem'ы?:)
 
3:15 PM
@Андрей Ну у меня идёт по столбцам, а как дойдёт до конца строки, переходит к следующему.
@Bretbas Привет
@Bretbas Хм. Через ItemGenerator или как его там? Ну или в лоб, через VisualChildren. Сейчас набросаю.
static IEnumerable<MenuItem> GetAllItems(Menu menu) => GetAllChildren(menu).OfType<MenuItem>();
static IEnumerable<FrameworkElement> GetAllChildren(FrameworkElement root) =>
    new[] { root }.Concat(GetDirectChildren(root).SelectMany(GetAllChildren));
static IEnumerable<FrameworkElement> GetDirectChildren(FrameworkElement root)
{
    var count = VisualTreeHelper.GetChildrenCount(root);
    for (int i = 0; i < count; i++)
        yield return (FrameworkElement)VisualTreeHelper.GetChild(root, i);
Это даст все MenuItem'ы, которые есть в визуальном дереве на данный момент
@Андрей Угу, классно.
Ну значит можно скомбинировать
 
@VladD Тоесть это даст не только Children'ов от root элемента MenuItem'а, а вообще все?
 
@Bretbas GetAllItems даст только нужные, мы ж фильтруем через OfType
А просмотра всего дерева не избежать
Потому что теоретически MenuItem может быть потомком любого элемента
Значит, просматривать нужно все
Память не расходуется, потому что lazy evaluation, LINQ всё-таки
 
@VladD а что это за конструктция: new[] { root }. ?
 
Ну, я создаю массив из одного элемента. Если тип очевиден, можно его не указывать.
То есть это всё равно что new FrameworkElement[1] { root }
Но короче
 
3:32 PM
хм, че то я пишу:
var children = new List<MenuItem>();
children = GetAllItems( menu ).ToList();
 
Угу, и что?
Пусто?
 
и Children имеет ровно столько же элементов, сколько в коллекции VM'а, но Header'ы равны null почему-то. Странно, вроде все везде привязал нормально. Ща перепровер.
 
Может, привязка ещё не пробежала? В любом случае, новых MenuItem'ов код не создаёт
 
ща постой
 
Ух ты! В .NET 4.7.1 / .NET Standard 2.0 можно написать просто
    static IEnumerable<FrameworkElement> GetAllChildren(FrameworkElement root) =>
        GetDirectChildren(root).SelectMany(GetAllChildren).Prepend(root);
Наконец-то.
 
3:38 PM
@VladD Что этот метод делает Prepend?
@VladD Ну а когда я уже у дочерних menuitem'ов ищу дочерние подпункты, то GetAllItems( menuItem ).ToList() уже не подходит. Так как работает только с menu
 
3:58 PM
@Bretbas То же самое, добавляет элемент в начало последовательности
И я надеюсь, что добавление n элементов не даёт квадратичного падения производительности, как это у Concat
@Bretbas А тебе и не надо. Он даёт сразу все, на всех уровнях
Если нужно позже применять на MenuItem'е, то поменяй GetAllItems(Menu menu) на GetAllItems(FrameworkElement element)
 
@VladD хм, а почему должна у него падать производительность? По идее мы просто перебираем сначала одну последовательность и возвращаем элементы из нее, потом вторую...
 
@Андрей Ну, если я в цикле делаю Concat
То у меня получается Concat глубокой вложенности
 
Что посоветуете почитать - смотреть по отладке софта - основы ?
Как он там по модному называется, дебаггинг *
 
И перечисление его происходит так: перечисляется самый внешний, он открывает перечисление следующего, тот в свою очердь следующего и далее до самого внутреннего. Ну и перечисление происходит существенно дольше.
 
@VladD хм, ну на такой случай можно написать свой метод
 
4:09 PM
@webstackoverload Интерфейс Visual Studio?
@Андрей ConcatMany?
Или какая должна быть сигнатура?
 
@VladD ну это уже зависит от того, что мы имеем на входе, если просто пачку коллекций, то хоть через params их передать
А внутри по очереди проитерировать по ним
 
@webstackoverload А что там думать по отладке? Вы должны остановиться и примерно представлять себе, какие ожидаются значения переменных. Посмотреть реальные значения. Увидеть, что не соответствует, попробовать понять, почему.
 
@VladD имхо, не очень удачное решение, чтобы добавить в начало последовательности несколько элементов надо перечислять их в обратном порядке
 
@Андрей Не, это возможно и так: Concat(sequences.SelectMany(x => x))
Вопрос не в этом
Допустим, у меня есть группа методов, из которых каждый добавляет элементы по одному
То есть мы не знаем в одной точке, что нужно добавлять
А знаем это по кусочкам
То есть мы не можем избежать n штук Concat'ов
 
Ну я понял, думаю с Prepend тут тоже самое, иного решения я не представляю
@VladD ^
 
4:23 PM
@Андрей Не, там есть хитрое решение
Prepend создаёт объект типа PrependEnumerable
Затем, функция Prepend проверяет свой аргумент
И если он тоже типа PrependEnumerable, то она не создаёт PrependEnumerable(x, PrependEnumerable(y, rest))
А создаёт PrependEnumerable([x, y], rest)
То есть как бы линеаризирует результат
Вот
И то же самое должен по идее делать и Concat
 
PrependEnumerable это какой-то новый internal тип?
 
Ага
Ну, это я его только что выдумал
Как он у них называется, я не знаю
Хотя, можно подсмотреть в исходники
 
@VladD ну да, было бы логично переписать с его использованием Concat
 
4:42 PM
@VladD в morelinq, я смотрю, довольно кривенькое решение
 
@Андрей Правда? Я не смотрел, что они там делают.
 
Правда я не до конца понял как это работает там, но создание четырех элементов выглядит так себе
В майкрософтовском репозитории не нашел пока Prepend
 
@Андрей Вот вроде: github.com/dotnet/corefx/blob/…
 
4:59 PM
@VladD Я как-то видел на ютубе, где дебаггинг делали - это как я понимаю отладка ? - брейкпоинты, что-то там искали - смотрели, фиксили
Как я понимаю там есть целое направление в данной сфере
 
@VladD ага, довольно много букв
 
5:12 PM
@VladD мне GetAllItems( menu ).ToList() выдает MenuItem'ы только верхнего уровня. А как вложенные то найти? Попытки приведения menuItem.ItemsSource к List<MenuItem> неудачны, так как свойство ItemsSource содержит на данном этапе времени коллекцию из VM
 
5:30 PM
@VladD Я когда хочу вот так получить дочерние MenuItem: var children = menu.ItemsSource.Cast<MenuItem>() то все нормально. Но Мне нужно привести это к List<MenuItem>, поэтому делаю вот так: var children = menu.ItemsSource.Cast<MenuItem>().ToList();, и на этой строке кода вылетает исключение: System.InvalidCastException: 'Не удалось привести тип объекта "PTRCPriceCalculator.MenuItemViewModel" к типу "System.Windows.Controls.MenuItem".'
 
@Андрей Ага, я даже видел обсуждение на гитхабе, кажется
 
@VladD Очень странно, но я не могу даже в foreach цикле использовать эту коллекцию:
 
@Bretbas Хм, странно. А они на тот момент существуют? Может быть, их реально нет?
 
var children = menu.ItemsSource.Cast<MenuItem>()
foreach( var child in children ) {..}
вылетает то же самое исключение
 
А если пораскрывать все меню, и затем вызвать функцию?
 
5:31 PM
странно
 
var children = menu.ItemsSource.Cast<MenuItem>() — не, это не должно работать
@Bretbas ItemsSource даёт коллекцию VM-элементов, из которых через ItemTemplate будут построены MenuItem'ы
 
А как тогда привести?
 
То есть из неё MenuItem'ы никак не получить
 
допустим у меня есть MenuItem. Как вытащить из него дочерние MenuItem'ы?
 
Cast не пройдёт, элементы коллекции в реальности не являются MenuItem'ами
 
5:33 PM
@VladD ок, как тогда из menuitem'а вытащить его дочерние menuitem'ы?
@VladD я просто уже перепробовал по разному, никак не могу получить
 
Попробуй вот что: пораскрывай все элементы меню, и после этого запроси мне GetAllItems( menu ).ToList()
Я тоже попробую, момент
 
программно пораскрывать?>
 
Как угодно, хоть руками
Хм, и правда, не работает
 
@VladD суть в том, что VM правильно настроена, все привязывается. Только теперь мне нужно мое MenuPopupPlacementAttachedProperty настроить. Там то нужно по любому по дереву вниз пробегаться по MenuItem'ам
 
Сейчас починим :)
 
5:37 PM
@VladD да я и сам починю, просто скажи как из menuitem'а получать дочерние menuiitem'ы?:)
 
Не знаю пока :)
Судя по всему, их в визуальном дереве вовсе нет
То есть реально нет, нигде
 
Но до этого то были
когда статически создавал меню
без привязок и тд
 
Ну это когда без привязок
Подожди, сейчас поэкспериментирую
 
ок
 
Ах ты ж чёрт, нужно лезть в Popup, он не является частью визуального дерева.
Понимаешь?
 
5:43 PM
нет
:)
 
Смотри.
Мы спускаемся рекурсивно вниз по визуальному дереву
Через GetVisualChild
Но при этом Popup мы не получаем.
Потому что Popup — это отдельное окно, и он начинает новое визуальное дерево
Значит, нам нужно не VisualChildren, а LogicalChildren
логические потомки
Сейчас гляну, где их добыть
 
%)
 
Хм, свойство LogicalChildren закрыто
Так, надо подумать
@Bretbas Есть, нашёл :)
static IEnumerable<MenuItem> GetAllItems(Menu menu) =>
    GetAllChildren(menu).OfType<MenuItem>();
static IEnumerable<FrameworkElement> GetAllChildren(FrameworkElement root) =>
    GetDirectChildren(root).SelectMany(GetAllChildren).Prepend(root);
static IEnumerable<FrameworkElement> GetDirectChildren(FrameworkElement root)
{
    return LogicalTreeHelper.GetChildren(root).OfType<FrameworkElement>();
}
 
@VladD А я только начал читать про визуальное и логическое дерево:)
 
Ага :)
Давай объясню на пальцах
Логическое дерево — это то, что мы пишем в XAML'е
Окей?
 
5:50 PM
ага
 
Но каждый элемент раскрывается в свой темплайт
И вот если раскрыть таким образом каждый элемент, получается визуальное дерево
Кроме того, есть тонкости
Popup, например, не присутствует в визуальном дереве
а отрывает новое окно и в нём новое визуальное дерево
 
и?:)
 
Ну вот поэтому вложенных меню мы в визуальном дереве не видели
Потому что они в другом визуальном дереве
 
а как тогда получить другое визуальное дерево?
и как мы вообще заглядывали в визуальное дерево, я просто не понял
 
Ну, в общем случае никак, надо знать, где его искать
В визуальное дерево смотреть просто
Есть две функции: VisualTreeHelper.GetChildrenCount и VisualTreeHelper.GetChild
Имея корень, можно рекурсивно обойти всё дерево
Окей?
 
5:55 PM
ага
 
То же и с логическим деревом, как оказалось
 
стой
VisualTreeHelper.GetChild возвращает только один объект
 
Есть функция LogicalTreeHelper.GetChildren, которая даёт коллекцию всех дочерних элементов
 
а если там несколько?
 
стою
@Bretbas да, по индексу
@Bretbas Меняем индексы тогда в цикле
 
5:57 PM
понял
 
static IEnumerable<FrameworkElement> GetDirectChildren(FrameworkElement root)
{
    var count = VisualTreeHelper.GetChildrenCount(root);
    for (int i = 0; i < count; i++)
        yield return (FrameworkElement)VisualTreeHelper.GetChild(root, i);
}
Собственно я так и сделал
 
ага вижу
 
А для логических потомков есть готовая функция LogicalTreeHelper.GetChildren. Но она почему-то возвращает нетипизированный IEnumerable. Поэтому пришлось сделать OfType<>
Почему не Cast<>, угадаешь?
Ответ: потому что в логическом дереве может быть что угодно. Например, в моём логическом дереве у MenuItemШкатулки child-элемент — строка "Шкатулки".
Так что логическое дерево — это ну не так прямо совсем как XAML, но примерно так.
 
var children = new List<FrameworkElement>();
var count = VisualTreeHelper.GetChildrenCount(menu);
for (int i = 0; i < count; i++)
	children.Add( (FrameworkElement)VisualTreeHelper.GetChild(menu, i) );
у меня почему только один объект там
Border какой то
 
Ыыыыы! Неленивая функция.
@Bretbas Ну да.
Потому что в шаблоне у MenuItem'а на верхнем уровне Border
Нужно лезть рекурсивно внутрь.
 
6:03 PM
епать
 
Ну тк. Без LINQ будет некрасиво
 
и проверять постоянно:
var menuitem = VisualTreeHelper.GetChild(menu, i) as MenuItem; if( menuItem != null ) ...
И так находить menuItem'ы нужно?
 
Ну если проверять, то лучше if (VisualTreeHelper.GetChild(menu, i) is MenuItem menuitem) { ...
Но лучше LINQ, намного изящнее
 
но в любом случае так надо делать чтоли?
и искать menuitem'ы?
 
Но стой, ты ж идёшь через VisualTree
А мы выяснили, что этот путь закрыт
 
6:06 PM
ну?
 
Иди через LogicalTree
static IEnumerable<MenuItem> GetAllItems(Menu menu) =>
    GetAllChildren(menu).OfType<MenuItem>();
static IEnumerable<FrameworkElement> GetAllChildren(FrameworkElement root) =>
    GetDirectChildren(root).SelectMany(GetAllChildren).Prepend(root);
static IEnumerable<FrameworkElement> GetDirectChildren(FrameworkElement root) =>
    LogicalTreeHelper.GetChildren(root).OfType<FrameworkElement>();
У меня это работает (без Binding'ов)
Хе, есть простая идея
Зачем лазить в шаблон MenuItem'а и исправлять его?
Это сложно
Делаем по-царски: поменяем шаблон на свой.
Верно?
 
программно или в xaml?
 
Но нужно найти исходный шаблон, чтобы не выдумывать с нуля
В XAML, программно будет гемор
Ща найду, у меня где-то ответ был как раз про это
 
правой кнопкой мыши по элементу в дизайнере, там CopyTemplate
 
Угумс
Ну так ты всё сам знаешь
 
6:10 PM
Но суть в том, что тогда это AttachedProperty не нужно вовсе?
 
Да, мы как бы взяли в руки большую пушку и снесли всё к чёртовой матери.
Редактирование шаблона — это серьёзное оружие
3
Q: Собственный стиль Expander WPF

UporotayaPandaПодскажите как создать expander примерно такого стиля: Или поделитесь хорошими статьями где описывается создание подобных вещей, тк гугл не выдает ничего годного...(

Там про экспандер, но смысл тот же
Сейчас сделаем как надо
Тебе ж иконки не нужны, правильно? И чекбоксы
Можно всё повыкидывать
 
в плане не нужны?
 
Ну, в стандартном меню могут быть чекбоксы в каждом MenuItem'е
Они тебе нужны?
Если нет, можно из шаблона выкинуть
Если нужны, можно оставить
 
Я вообще не могу понять, как шаблон этот нацепить на меню
 
Ну например так:
<Menu>
    <Menu.Resources>
        <Style TargetType="MenuItem">
            <Setter Property="Template" Value="{StaticResource MyMenuItemTemplate}"/>
        </Style>
    </Menu.Resources>
</Menu>
Оно каждому Item'у даст наш стиль
 
6:22 PM
А на месте можно шаблон задать?
				<Menu.ItemTemplate>
							<ItemContainerTemplate>
							<ControlTemplate TargetType="{x:Type MenuItem}">
								<Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
									<Grid VerticalAlignment="Center">
										<Grid.ColumnDefinitions>
											<ColumnDefinition Width="Auto"/>
											<ColumnDefinition Width="Auto"/>
										</Grid.ColumnDefinitions>
 
Не-не, это по идее не то
В нём нет Popup'а!
Ну и ItemContainerTemplate — это не темплейт для MenuItem-ов
 
так, ну я в стиле задал
 
Смотри
 
короче давай так
ничего трогать там не буду
просто для popup'а задам placement
как получитьь там popup?
в шаблоне
 
Ну, вот в шаблоне должно быть написано <Popup Placement="..."/>
Вот пример того, как оно может определяться:
 
6:26 PM
Так его там нет
 
@Bretbas Значит это какой-то неправильный темплейт
В правильном есть
Больше ему кроме как из темплейта неоткуда взяться
Вот на docs.microsoft.com есть всё, что надо
 
вот все что есть в template моего menuitem'а:
<ControlTemplate TargetType="{x:Type MenuItem}">
<Border x:Name="templateRoot" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<Grid VerticalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="Icon" Content="{TemplateBinding Icon}" ContentSource="Icon" HorizontalAlignment="Center" Height="16" Margin="3" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" Ver
 
Момент :)
Вот на docs.microsoft.com:
<ControlTemplate x:Key="{x:Static MenuItem.SubmenuHeaderTemplateKey}"
                 TargetType="{x:Type MenuItem}">
  <Border x:Name="Border"
          BorderThickness="1">
    <Grid>
      <Grid.ColumnDefinitions>
        <ColumnDefinition Width="Auto"
                          SharedSizeGroup="Icon" />
        <ColumnDefinition Width="*" />
        <ColumnDefinition Width="Auto"
                          SharedSizeGroup="Shortcut" />
        <ColumnDefinition Width="13" />
      </Grid.ColumnDefinitions>
это один из них
там их 4 варианта
А в стиле происходит выбор между этими вариантами
<Style x:Key="{x:Type MenuItem}"
       TargetType="{x:Type MenuItem}">
  <Setter Property="OverridesDefaultStyle"
          Value="True" />
  <Style.Triggers>
    <Trigger Property="Role"
             Value="TopLevelHeader">
      <Setter Property="Template"
              Value="{StaticResource {x:Static MenuItem.TopLevelHeaderTemplateKey}}" />
      <Setter Property="Grid.IsSharedSizeScope"
              Value="true" />
    </Trigger>
    <Trigger Property="Role"
             Value="TopLevelItem">
 
ппц
мне чего делать вообще?:)
 
Ну тк.
Большое оружие требует большой настройки :)
Я тебе там ссылку давал на свой ответ, я там разбирал аналогичный случай
Тебе из этих 4-х темплейтов нужен только один
 
6:32 PM
Я вот этот взял
<ControlTemplate x:Key="{x:Static MenuItem.SubmenuHeaderTemplateKey}"
TargetType="{x:Type MenuItem}">
<Border x:Name="Border"
BorderThickness="1">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"
SharedSizeGroup="Icon" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto"
SharedSizeGroup="Shortcut" />
<ColumnDefinition Width="13" />
</Grid.ColumnDefinitions>
<ContentPresenter x:Name="Icon"
Margin="6,0,6,0"
VerticalAlignment="Center"
ContentSource="Icon" />
<ContentPresenter x:Name="HeaderHost"
 
Не, этот без попапа
Бери тот, который с попапом
 
как без?
с ним
<Popup x:Name="Popup"
Placement="Right"
HorizontalOffset="-4"
IsOpen="{TemplateBinding IsSubmenuOpen}"
AllowsTransparency="True"
Focusable="False"
PopupAnimation="Fade">
 
А, правда?
Ну и отлично
Placement у него уже такой, как надо
Можно HorizontalOffset подправить
И сразу Background :)
 
так:)
 
И ты сразу видишь, откуда Border :)
  <Border x:Name="Border"
          BorderThickness="1">
 
6:35 PM
у меня пишет ошибку
типо нет
 
@Bretbas Не находит StaticResource?
 
там динамик
это из шаблона
не мой же код
 
Какой не находит?
 
<SolidColorBrush Color="{DynamicResource GlyphColor}" />
Background="{DynamicResource MenuPopupBrush}"
и вот этот еще
 
Они определены внизу
 
6:37 PM
там вообще дохрена ошибок каких то
 
Прокрути в низ страницы
Будем править постепенно
GlyphColor видишь?
<Color x:Key="GlyphColor">#FF444444</Color>
 
ага
 
Клади его в ресурсы над темплейтом
Ща все ошибки устраним
Кто тут хозяин — мы или дурная железяка?
 
:)
А в ресурсы чьи класть?
 
Ну, ты ж темплейт кладёшь в ресурсы?
В чьи кладёшь?
Тут рядом и Color
 
6:40 PM
темплейт я кладу в Template
 
Не-не, это нехорошо
Сделай лучше отдельно
Стой, в какой Template?
В стиль?
 
да
в стиле
 
А стиль где?
 
<Setter Property="Template>
<Setter.Value>
Стиль прям в UserControl'е
 
В UserControl.Resources?
 
6:42 PM
нет, прям в объявлении меню
 
Аааа!
Не, не делай так. Сделай UserControl.Resources, и клади всё туда
А то там много будет
 
Блин, на самом деле у меня стиль этот в MainWindow.xaml
там где я меню создаю
так как у моего UserControl'а есть DependencyProperty
ItemContainerStyleProperty
В UserControl я просто подвязываюсь на него
ItemContainerStyle="{Binding ElementName=UC, Path=ItemContainerStyle}">
а задаю стиль прям при объявлении моего UserControl'а в MainWindow.xaml
 
Ну значит в MainWindow.Resources
Или вообще в App.Resources
 
Но я бы хотел сделать следующее. Чтобы через переопределения шаблона моего UserControl, нельзя было задавать у Popup'а свойство Placement. Я хотел бы сделать DependencyProperty у моего UserControl, которое имеет два состояния - Left, Right. Через это DependencyProperty можно было устанавливать, в какую сторону будет меню раскрываться.
 
Окей, понял
 
6:49 PM
Тоесть я не хочу давать пользователю полностью изменять всю структуру, и там уже менять Placement. Я хочу чтобы это автоматически делалось на уровне UserControl'а
Но мне пора бежать
через 5 минут в барак
 
Ага, понимаю
 
завтра тогда поговорим.
 
Ну так два стиля
 
Ты напиши тогда, я утром включусь, посмотрю
Все пока
 
Или в стиле привяжи Placement прямо к attached property
Ага, давай
хорошего вечера
Смотри, делаешь обыкновенное attached property PopupPlacement
Без логики, тупое
И в твоём template'е привязываешь Popup.Placement к нему
Вот и всё
 

« first day (844 days earlier)      last day (2187 days later) »