Используйте Canvas в качестве контейнера, он позволяет внутри себя все абсолютно позиционировать. Для любого элемента внутри Canvas можно задавать свойства Canvas.Left, Canvas.Top и т.д.
Здравствуйте, notacat, Вы писали:
N>да, еще убедитесь, что Focusable=true, это может влиять на поведение.
Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...
Здравствуйте, iVoffka, Вы писали:
V>Всем привет.
V>WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.
И не зря обошел. В WPF совершенно другая идеология размещения — кому сколько надо, тот столько и занял, а остальные подвинулись и подвинули остальных.
Если фиксировать размещение контролов, то стоит только поменять настройки Windows и такие "прибитые гвоздями" контролы начинают друг на друга наползать.
Но если Вам все же ну просто позарез нужно сделать как Вы написали... Добавьте в окно грид, а уже в него вставляйте контролы, указывая каждому отступ слева и сверху (свойство margin), но не указывая позиции в ячейках грида.
WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.
Re[2]: Программное позиционирование контролов WPF
От:
Аноним
Дата:
12.04.09 12:10
Оценка:
Здравствуйте, SE, Вы писали:
SE>Здравствуйте, iVoffka, Вы писали:
V>>Всем привет.
V>>WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.
SE>И не зря обошел. В WPF совершенно другая идеология размещения — кому сколько надо, тот столько и занял, а остальные подвинулись и подвинули остальных. SE>Если фиксировать размещение контролов, то стоит только поменять настройки Windows и такие "прибитые гвоздями" контролы начинают друг на друга наползать.
SE>Но если Вам все же ну просто позарез нужно сделать как Вы написали... Добавьте в окно грид, а уже в него вставляйте контролы, указывая каждому отступ слева и сверху (свойство margin), но не указывая позиции в ячейках грида.
Спасибо за совет. Я понимаю, что там идеология размещения другая. Все дело в том, что мне надо рисовать изображения некоторых объектов. Эти изображения я представил в виде Polygon и Ellipse, а они являются контролами. И размещать их надо строго в координатах той точки, где пользователь ткнул мышкой.
Еще вопрос: я сделал UserControl, поместил объект этого контрола на главную форму и обрабатываю событие MouseDown:
Здравствуйте, iVoffka, Вы писали:
V>Всем привет.
V>WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.
Вроде бы canvas позволяет такое точное размещение объектов на себе.
Сам не делал, только книжку читал.
А>Еще вопрос: я сделал UserControl, поместил объект этого контрола на главную форму и обрабатываю событие MouseDown: А>Но обработчик не вызывается. Не вызывается он и в случае, если я его определю в самом UserControl. Из-за чего такое возможно?
Возможно, какой-нибудь объект внутри этого контрола, событие обрабатывает.
Подпишитесь на PreviewMouseDown и в самом контроле сделайте override для OnMouseDown и OnPreviewMouseDown, и посмотрите на все это в отладчике.
да, еще убедитесь, что Focusable=true, это может влиять на поведение.
Re[2]: Программное позиционирование контролов WPF
От:
Аноним
Дата:
13.04.09 00:11
Оценка:
Здравствуйте, notacat, Вы писали:
N>Используйте Canvas в качестве контейнера, он позволяет внутри себя все абсолютно позиционировать. Для любого элемента внутри Canvas можно задавать свойства Canvas.Left, Canvas.Top и т.д.
N>Вот пример из MSDN:ъ N>
Спасибо. Пожалуй я так и сделаю. Единственное, что смущает — отсутствие в явном виде свойств Left и Top, когда я пытаюсь программно установить контрол... Но думаю, что маргин делает то же самое.
Здравствуйте, <Аноним>, Вы писали:
А>Спасибо. Пожалуй я так и сделаю. Единственное, что смущает — отсутствие в явном виде свойств Left и Top, когда я пытаюсь программно установить контрол...
Естесственно, это же Attached Property. Используйте функции Canvas.SetLeft, Canvas.SetTop и так далее.
... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>
Re[4]: Программное позиционирование контролов WPF
От:
Аноним
Дата:
13.04.09 07:08
Оценка:
Здравствуйте, SiAVoL, Вы писали:
SAV>Здравствуйте, <Аноним>, Вы писали:
А>>Спасибо. Пожалуй я так и сделаю. Единственное, что смущает — отсутствие в явном виде свойств Left и Top, когда я пытаюсь программно установить контрол... SAV>Естесственно, это же Attached Property. Используйте функции Canvas.SetLeft, Canvas.SetTop и так далее.
Спасибо, вопрос полностью исчерпан. Что-то я не посмотрел в статических методах... Надо еще раз внимательнее про присоединенные свойства почитать.
Здравствуйте, iVoffka, Вы писали:
V>Здравствуйте, notacat, Вы писали:
N>>да, еще убедитесь, что Focusable=true, это может влиять на поведение.
V>Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...
Wpf таит в себе еще не мало сюрпризов. Основная идеология там, что в визуальном дереве находится только, то что видимо пользователю. Остальное показывать смысла нет. Переоптимизировали короче немного.
V>Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...
Да, есть такое дело. Это не баг, так у MS задумано. Не обязательно белую кисть задавать, можно задать Transparent — тогда внешний вид не поменяется, а события ловить будет.