Re: Программное позиционирование контролов WPF
От: notacat  
Дата: 12.04.09 13:03
Оценка: 5 (1) +1
Используйте Canvas в качестве контейнера, он позволяет внутри себя все абсолютно позиционировать. Для любого элемента внутри Canvas можно задавать свойства Canvas.Left, Canvas.Top и т.д.

Вот пример из MSDN:ъ
<Canvas Width="300" Height="300" Background="White">
    <Canvas Width="250" Height="250" Canvas.Left="30" 
            Canvas.Top="30" Background="blue">

        <Rectangle Canvas.Left="30" Canvas.Top="30" 
                   Fill="red" Width="200" Height="200" />
    </Canvas>
</Canvas>
Re[5]: Программное позиционирование контролов WPF
От: iVoffka  
Дата: 13.04.09 08:10
Оценка: 5 (1)
Здравствуйте, notacat, Вы писали:

N>да, еще убедитесь, что Focusable=true, это может влиять на поведение.


Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...
Re: Программное позиционирование контролов WPF
От: SE Украина  
Дата: 12.04.09 10:41
Оценка: +1
Здравствуйте, iVoffka, Вы писали:

V>Всем привет.


V>WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.


И не зря обошел. В WPF совершенно другая идеология размещения — кому сколько надо, тот столько и занял, а остальные подвинулись и подвинули остальных.
Если фиксировать размещение контролов, то стоит только поменять настройки Windows и такие "прибитые гвоздями" контролы начинают друг на друга наползать.

Но если Вам все же ну просто позарез нужно сделать как Вы написали... Добавьте в окно грид, а уже в него вставляйте контролы, указывая каждому отступ слева и сверху (свойство margin), но не указывая позиции в ячейках грида.
Программное позиционирование контролов WPF
От: iVoffka  
Дата: 12.04.09 08:12
Оценка:
Всем привет.

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:

<Window x:class=""....
        xmlns:local="clr-namespace=Namespace;assembly=MyAssembly">

   <local:UserControl MouseDown=handler />
</Window>


Но обработчик не вызывается. Не вызывается он и в случае, если я его определю в самом UserControl. Из-за чего такое возможно?

Большое спасибо за ответы.
Re: Программное позиционирование контролов WPF
От: vasilov  
Дата: 12.04.09 12:43
Оценка:
Здравствуйте, iVoffka, Вы писали:

V>Всем привет.


V>WPF начал изучать недавно. Как у пользователя WinForms возник вопрос: есть в WPF какой-нибудь аналог свойства Location у контрола? Т.е. мне нужно программно разместить некоторый контрол на форме с нужными мне координатами. Поясню на примере: я щелкаю мышкой на форме/панели и в этой точке размещается контрол, скажем кнопка. В winForms я мог сделать контрол.Location = "нужные координаты", а как это в WPF сделать — неясно. МакДональдс как-то обошел этот момент стороной в своей книге.


Вроде бы canvas позволяет такое точное размещение объектов на себе.
Сам не делал, только книжку читал.
... << RSDN@Home 1.2.0 alpha 4 rev. 1139>>
Re[3]: Программное позиционирование контролов WPF
От: notacat  
Дата: 12.04.09 13:07
Оценка:
А>Еще вопрос: я сделал UserControl, поместил объект этого контрола на главную форму и обрабатываю событие MouseDown:
А>Но обработчик не вызывается. Не вызывается он и в случае, если я его определю в самом UserControl. Из-за чего такое возможно?

Возможно, какой-нибудь объект внутри этого контрола, событие обрабатывает.
Подпишитесь на PreviewMouseDown и в самом контроле сделайте override для OnMouseDown и OnPreviewMouseDown, и посмотрите на все это в отладчике.
Re[4]: Программное позиционирование контролов WPF
От: notacat  
Дата: 12.04.09 13:17
Оценка:
да, еще убедитесь, что Focusable=true, это может влиять на поведение.
Re[2]: Программное позиционирование контролов WPF
От: Аноним  
Дата: 13.04.09 00:11
Оценка:
Здравствуйте, notacat, Вы писали:

N>Используйте Canvas в качестве контейнера, он позволяет внутри себя все абсолютно позиционировать. Для любого элемента внутри Canvas можно задавать свойства Canvas.Left, Canvas.Top и т.д.


N>Вот пример из MSDN:ъ

N>
N><Canvas Width="300" Height="300" Background="White">
N>    <Canvas Width="250" Height="250" Canvas.Left="30" 
N>            Canvas.Top="30" Background="blue">

N>        <Rectangle Canvas.Left="30" Canvas.Top="30" 
N>                   Fill="red" Width="200" Height="200" />
N>    </Canvas>
N></Canvas>
N>


Спасибо. Пожалуй я так и сделаю. Единственное, что смущает — отсутствие в явном виде свойств Left и Top, когда я пытаюсь программно установить контрол... Но думаю, что маргин делает то же самое.
Re[3]: Программное позиционирование контролов WPF
От: SiAVoL Россия  
Дата: 13.04.09 04:52
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Спасибо. Пожалуй я так и сделаю. Единственное, что смущает — отсутствие в явном виде свойств 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 и так далее.

Спасибо, вопрос полностью исчерпан. Что-то я не посмотрел в статических методах... Надо еще раз внимательнее про присоединенные свойства почитать.
Re[6]: Программное позиционирование контролов WPF
От: Visor2004  
Дата: 13.04.09 08:27
Оценка:
Здравствуйте, iVoffka, Вы писали:

V>Здравствуйте, notacat, Вы писали:


N>>да, еще убедитесь, что Focusable=true, это может влиять на поведение.


V>Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...

Wpf таит в себе еще не мало сюрпризов. Основная идеология там, что в визуальном дереве находится только, то что видимо пользователю. Остальное показывать смысла нет. Переоптимизировали короче немного.
Помните!!! ваш говнокод кому-то предстоит разгребать.
Re[6]: Программное позиционирование контролов WPF
От: notacat  
Дата: 13.04.09 08:31
Оценка:
V>Эммм... Помогло следующее: я поставил для Canvas свойство background=White, и все заработало... Почему-то обработчики событий нажатия на кнопки мыши не работают, если background = null...
Да, есть такое дело. Это не баг, так у MS задумано. Не обязательно белую кисть задавать, можно задать Transparent — тогда внешний вид не поменяется, а события ловить будет.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.