« first day (840 days earlier)      last day (2191 days later) » 

8:13 AM
0
Q: Обращение к внутренним контролам, которые находятся в Template моего UserControl'а

BretbasДоброго времени суток, Господа. Хотел бы узнать, как можно обратиться к внутренним контролам, которые находятся в Template моего UserControl'а? Если определить эти контролы прям внутри UserControl'а, без Template, то по x:Name я могу обратиться к ним в codebehind. А если в Template их объявляю, т...

 
 
4 hours later…
12:02 PM
0
Q: Привязанное свойство зависимости не изменяется

BretbasПривет всем. Не могу разобраться в DependencyProperty. Допустим у нас есть UserControl - LoginBox. Внутри этого контрола лежит TextBox, у которого свойство Text подвязано на свойство Text, которое в свою очередь объявлено в codebehind внутри LoginBox: <UserControl x:Class="PTRCPriceCalculator.Lo...

 
 
2 hours later…
2:21 PM
0
Q: Команды в UserControl. Зачем нужны параметры в разметке

BretbasА теперь вопрос по командам... Что-то мне кажется я зачастил. Итак, если SearchBox - это UserControl, который содержит в себе TextBox(на самом деле InputBox - тоже UserControl, который расширяет стандартный TextBox возможностью устанавливать placeholder) и Button. Мне нужно реализовать команду, ...

 
@Bretbas, зачем вы здесь дублируете вопросы? Вы думаете есть такие люди, которые ходят только в чат, но не ходят в ruSO и при этом они внезапно захотят вам ответить?
 
Да я хрен знает:)
здесь все равно пустота:)
 
@Андрей такие люди есть
например я чаще посещаю чаты чем основной сайт
 
@VladD, а не напомните, как зарегистрировать AttachedProperty, но чтобы его можно было использовать только с определенными контролами, например, я сделаю какой-нибудь GridEx.RowCount и хочу чтоб его можно было цеплять только к Grid, но не к Button, TextBox, StackPanel и прочим?
@FoggyFinder ⟰
@FoggyFinder ок, пусть тогда дублирует :)
 
@Андрей не так часто писал AP, но разве там не пишется параметром тип?
 
2:34 PM
@FoggyFinder неа, там есть ownerType, но туда передается имя регистрирующего класса (зачем - хз), т.е. в моем примере я туда передаю typeof(GridEx)
 
^ AttachedPropertyBrowsableForType не оно?
AttachedPropertyBrowsable
 
А как сделать так, чтобы при наведении на пункт меню, вылезали подпункты?:)
только не отправляйте меня на SO пожалуйста:)
просто скажите в кратце, как это делается
 
@Bretbas вылезали куда?
 
или не наведении, а нажатии на пункт меню, чтобы влево вылезала панелька с подпунктами
 
@FoggyFinder хм, похоже, только что им помечать? AttributeUsageAttribute(AttributeTargets.Method ... написано
 
2:37 PM
ну в бок к примеру
 
@FoggyFinder не, этот абстрактный
@Bretbas использовать popup/toolTip?
 
@Андрей в этом msdn совсем можно запутаться =/
 
@Андрей дело в том, что у этих подпунктов может быть еще подпункты и тд
 
@FoggyFinder лучше, чем уж когда никакой документации ;)
 
меню хочу сделать попробовать
 
2:40 PM
@Bretbas Это не важно
 
Ну а главное меню у меня в Grid находится
 
@Bretbas Menu и используйте
или ContextMenu
 
не понял? Я с нуля хочу сделать
 
@Андрей может это и не оно, как-то в голову такой вопрос не приходил
если ничего лучше не найдете то знаю у кого спросить, когда в следующий раз появлюсь онлайн напишу
 
@Bretbas ну тогда берите Popup и в нем уже что хотите отображайте
@FoggyFinder даже если и оно - не понятно как им пользоваться...
 
2:46 PM
@Андрей Там где-то указывался базовый тип, сейчас попробую вспомнить.
 
ща посмотрю что это
 
Атрибут никакого эффекта не дает или я его не туда цепляю
Хм, похоже что надо в методе указать вместо DependencyObject конкретный тип контрола: public static int GetRowCount(Grid obj)
Тогда ругается:
Severity Code Description Project File Line Suppression State
Error The attached property "RowCount" can only be applied to types that are derived from "Grid". WpfTest D:\Projects\My projects\WpfTest\WpfTest\MainWindow.xaml 18
Очень странное решение...
 
@Андрей Стоп, вроде бы attached property можно навесить на любой объект.
Запретить как бы нельзя
 
Ну вроде получилось же ;) Но выглядит, конечно, криво
 
@Андрей А как получилось? Что вы прописали в RegisterAttached?
 
2:54 PM
:41497701
public static int GetRowCount(Grid obj) => (int)obj.GetValue(RowCountProperty);
public static void SetRowCount(Grid obj, int value) => obj.SetValue(RowCountProperty, value);
public static readonly DependencyProperty RowCountProperty =
	DependencyProperty.RegisterAttached("RowCount", typeof(int), typeof(GridEx), new PropertyMetadata(0));
 
@Андрей Хм.
А если вообще убрать геттер и сеттер? Они ж вроде только для удобства
Странно
А какой код не компилируется с таким определением?
 
@VladD вообще тогда не работает
 
@Андрей Ого, не знал, прикольно
 
@VladD <Button Content="Content" local:GridEx.RowCount="1"/>
 
Тогда вопрос — а этот геттер и сеттер реально вызываются?
Если там бряку поставить
Потому что меня учили, что в DP они не вызываются, и поэтому, в частности, прописывать там кастомную логику нет смысла
А в AP как?
 
2:57 PM
@VladD тоже нет
 
@Андрей Ыыыыы!
 
@VladD это да, даже вредно
@VladD но без них не находит АР вообще разметка
 
То есть получается, что геттер и сеттер есть, но они нужны только для проверки типов?
Чудны дела твои, господи Microsoft!
 
@VladD ну я хз, похоже что так
Ахаха
ReadOnly AttachedProperty - вы могли вообще подумать, что это возможно?
это если присутствует только GetRowCount метод
 
@Андрей Да, раз есть readonly DP
Есть же DP.RegisterReadOnly
 
3:01 PM
@VladD причем он компилируется, но просто в разметке студия ругается
@VladD хм, есть и RegisterAttachedReadOnly...
А если убрать SetRowCount, то свойство тоже становится ReadOnly что ли, даже если оно зарегистрировано как обычное RegisterAttached
@VladD так что, как всё-таки правильно ограничить применение AP к контролам?
 
@Андрей А запускается? А то мало ли чего Intellisense там говорит
 
@VladD да
 
@Андрей Не совсем. Потому что любой может вызвать SetValue вручную.
А вот с RegisterReadOnly фигушки
@Андрей Небось BindingMode=TwoWay всё равно работает
 
@VladD да, но если я его задаю в разметке, то проект даже не компилируется
@VladD неа, не стартует проект
 
@Андрей ?
Это если сделать RegisterAttached без ReadOnly и не определить сеттер?
Не совсем понял, что именно не компилируется
 
3:09 PM
я удалил SetRowCount, проект не компилируется:
Severity Code Description Project File Line Suppression State
Error 'GridEx.RowCount' property is read-only and cannot be set from markup. Line 11 Position 38. WpfTest D:\Projects\My projects\WpfTest\WpfTest\MainWindow.xaml 11
на этой строчке: <Grid Margin="5" Name="RootGrid" local:GridEx.RowCount="1">
 
Прикольно. А BindingMode=TwoWay?
 
@VladD на что?
 
Tag={Binding (local:GridEx.RowCount), BindingMode=TwoWay}
 
неа
 
@Андрей не компилируется?
 
3:13 PM
@VladD а, стоп
да, всё компилирует и запускает
 
@Андрей и изменяет значение?
 
а хз, не проверял
Как всё-таки ограничить к чему цеплять AP?
и для чего тогда AttachedPropertyBrowsableForTypeAttribute (как им вообще пользоваться?)?
 
AttachedPropertyBrowsableForTypeAttribute выглядит как указание для Intellisense
 
@VladD короче не влияет оно (или я неправильно пользуюсь), а влияет именно то что я в сигнатуре метода указал конкретный тип контрола, тогда Intellisense даже не предлагает его на кнопке, например
GetRowCount(Grid obj)
 
@Андрей Угу, понял. Good to know, запомню на будущее
 
3:25 PM
@VladD да, но фактически на самом деле никак не ограничить использование, хоть студия и ругается и подчеркивает, но если задать PropertyChangedCallback, то он вызывается
 
@Андрей Угумс
Ну хоть подсказывать не будет
 
что противно, в колбеке в этом я тип параметра как раз поменять не могу на конкретный, только DependencyObject
 
@Андрей Ага, всё время нужно приводить
WPF вообще плохо дружит с generic-ами
Наверное, чтобы можно было пользоваться не только из C#
 
@VladD, у вас, кстати, никаких наработок нету, хочу упростить немного разметку грида, чтоб не лепить многоуровневую разметку, задавать количество строк в нем через AP?
 
@Андрей Не-а, но можно использовать UniformGrid, там можно просто задавать к-во строк и столбцов (да ещё и через привязку).
Да, это не равноценная замена
Но мне всегда хватало
 
3:32 PM
В том-то и дело, что мне нужна возможность потом в контролах указывать номер строки/столбца
 
@Андрей Хм, это хуже
Я бы тогда написал расширение для UniformGrid
 
@VladD у него на сколько я помню, все ячейки одинаковых размеров?
 
@Андрей Да
 
мне это не подойдет
 
:( Тогда придётся вручную, боюсь
Я с таким не сталкивался
 
3:35 PM
ну хотя бы это упростить я могу (попытаюсь по крайней мере):
<Grid.RowDefinitions>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
    <RowDefinition/>
</Grid.RowDefinitions>
Будет просто local:GridEx.RowCount="15"
 
Поскажите пожалуйста, как вывести пункты меню в кастомное меню?
Я уже измучался
			<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
				<ItemsControl ItemsSource="{Binding ElementName=UC, Path=MenuItems}">
					<ItemsControl.ItemTemplate>
						<DataTemplate>
							<local:SideMenuItem Style="{Binding ElementName=UC, Path=ItemContainerStyle}"/>
						</DataTemplate>
					</ItemsControl.ItemTemplate>
				</ItemsControl>
			</ScrollViewer>
вот код моего SideMenu, где MenuItems и ItemContainerStyle объявлены как свойства зависимости в codebehind
 
@VladD, ух ты, это даже в дизайнере работает:
<Grid Margin="5" Name="RootGrid" local:GridEx.RowCount="3">
    <Button Grid.Row="1" Content="Content1"/>
    <Button Grid.Row="2" Content="Content2"/>
</Grid>
!
 
Вот так выглядит пункт меню:
	<UserControl.Template>
		<ControlTemplate TargetType="{x:Type UserControl}">
			<Grid>
				<TextBlock Text="{TemplateBinding local:SideMenuItem.NameItem}"
						   Margin="10"
						   Background="Red"/>
			</Grid>
		</ControlTemplate>
	</UserControl.Template>
И вот так я все присоединяю:
		<local:SideMenu MenuItems="{Binding MenuVM.Categories}">
			<local:SideMenu.ItemContainerStyle>
				<Style TargetType="{x:Type local:SideMenuItem}">
					<Setter Property="NameItem" Value="{Binding Name}"/>
				</Style>
			</local:SideMenu.ItemContainerStyle>
		</local:SideMenu>
Выводятся пункты меню, но названий нет
В чем может быть дело? Не подскажете?
вроде все правильно то
Есть здесь кто?
 
3:55 PM
тут
 
Не подскажете?
 
@Андрей Ну да, дизайнер выполняет ваш код :)
 
@Bretbas может контекст не видит?
 
Не зря ж он такой падучий
 
4:01 PM
Но пункты отображаются ровно такое количество, какое есть в VM
 
@Bretbas нет, я имел ввиду контекст элемента, а не о общий
 
А как проверить?
Конечно же не видит, если бы видел, то все бы работало:)
Так, что я не правильно сделал?
 
я обычно использую Snoop
@Bretbas раз не работает =)
 
Блин, не очень хотелось бы вникать в это все, ради такой мелочи...
 
Text="{TemplateBinding local:SideMenuItem.NameItem}"
откуда вы взяли такой код?
NameItem это чье свойство?
и зачем :
<UserControl.Template>
		<ControlTemplate TargetType="{x:Type UserControl}">
?
 
4:08 PM
Это мое объявленное в codebehind свойство зависимости внутри класса local:SideMenuItem
Все, исправил. Надо было по непонятным причинам писать вот так: Style="{Binding ItemContainerStyle, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}
<ScrollViewer Grid.Row="2" VerticalScrollBarVisibility="Auto">
	<ItemsControl ItemsSource="{Binding ElementName=UC, Path=MenuItems}">
		<ItemsControl.ItemTemplate>
			<DataTemplate>
				<local:SideMenuItem Style="{Binding ItemContainerStyle, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"/>
			</DataTemplate>
		</ItemsControl.ItemTemplate>
	</ItemsControl>
</ScrollViewer>
 
странный код
 
Почему странный? Все здесь понятно
Странно что мне до стиля нужно дотягиваться вот так:Style="{Binding ItemContainerStyle, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"
вот это странно
 
и я об этом
 
По другому не работает
по идее должно работать вот так:
 
@Bretbas А что странного-то? Binding производится к DataContext'у.
 
4:13 PM
Style="{Binding ItemContainerStyle, RelativeSource={RelativeSource TemplateParent}}"
Я пока не могу понять всех этих тонкостей, делаю методом тыка в некоторых местах, и меня это напрягает жестко
после C++ для меня это все темный лес какой то
 
@Bretbas Так вы получаете Item, правильно?
Что у вас TemplatedParent?
 
@FoggyFinder хм, интересно, надо пощупать, а он умеет делать отступы между строками грида?
 
@Андрей отступы между строками ?
 
@FoggyFinder да, я, допустим делаю 2 строки с текстбоксами и верхнему из них задаю margin="0,0,0,5" например, другой путь - сделать между ними еще одну строку грида, пустую с высотой 5
можно заставить его генерировать пустые строки с заданной высотой?
между непустыми
 
не знаю, не пользовался, но могу спросить если нужно
 
4:29 PM
@FoggyFinder это ваш знакомый разрабатывает?
я смотрю, вы часто "рекламируете" наработки этого автора
 
@Андрей да
 
@FoggyFinder спросите, конечно, тогда :)
 
 
1 hour later…
5:54 PM
насколько понял такого нет, но возможно имеет смысл добавить, пока только не очень ясно как лучше указывать какие строки делать пустыми
 
 
1 hour later…
7:12 PM
@FoggyFinder Сделать булево свойство ВключеныПромежуточныеСтроки и double-свойство ВысотаПромежточнойСтроки, и если ВключеныПромежуточныеСтроки=True, то вместо n строк генерируем (2n-1), элементы помещаем в каждую нечетную строку, а каждую четную делаем пустой с фиксированной высотой =ВысотаПромежточнойСтроки
я так это вижу
 
8:00 PM
@Андрей хорошая идея, не хотите создай ишшью + PR?
 
8:14 PM
@FoggyFinder хочу, но надо время, вникнуть в код... да и вообще попробовать этот Gu.Wpf.AutoGrid
я тут себе набросал за 20 мин: pastebin.com/NmKra3dx
теперь можно писать типа:
<Grid Margin="5" Name="RootGrid" local:GridEx.RowCount="3" local:GridEx.RowHeights="100 * Auto">
    <Button Grid.Row="1" Content="Content1"/>
    <Button Grid.Row="2" Content="Content2"/>
</Grid>
в принципе, от куска разметки большого уже можно избавиться, но, конечно, автоформирование строк + авторазмещение контролов в этих новых строках без указания Grid.Row фича хорошая
 
9:18 PM
угу
 
 
1 hour later…
10:29 PM
@Bretbas лучше по максимуму использовать готовые решения, особенно если нужно быстро получить результат
 

« first day (840 days earlier)      last day (2191 days later) »