С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.63/27: Рейтинг темы: голосов - 27, средняя оценка - 4.63
Vangok
77 / 76 / 13
Регистрация: 21.10.2010
Сообщений: 349
1

Перемещение и изменение размеров UserControl в Window посредством мышки

05.06.2011, 16:10. Просмотров 4943. Ответов 11
Метки нет (Все метки)

Есть UserControl, который необходимо, как перемещать, так и изменять его размеры в другом контроле, например Canvas, который расположен в Window.
Контрол содержит в себе несколько элементов, которые вместе с самим контролом также должны пермещаться, вот код самого контрола:
XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
<Grid x:Name="LayoutRoot">
        <Grid Height="27" VerticalAlignment="Bottom">
            <Rectangle Stroke="Black">
                <Rectangle.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="Black" Offset="0"/>
                        <GradientStop Color="#FF060202" Offset="1"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
            <ResizeGrip HorizontalAlignment="Right" Width="30" Background="#00000000" Cursor="SizeNS"/>
            <Label Content="ss" Margin="0,0,103,0" Foreground="White"/>
        </Grid>
        <Grid Margin="0,0,0,27">
            <Rectangle Height="28" Stroke="Black" VerticalAlignment="Top">
                <Rectangle.Fill>
                    <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
                        <GradientStop Color="Black" Offset="0"/>
                        <GradientStop Color="#FF060202" Offset="1"/>
                    </LinearGradientBrush>
                </Rectangle.Fill>
            </Rectangle>
            
            <Border BorderThickness="1" Margin="0,28,0,0" BorderBrush="#FF0C0A0A">
                <Grid>
                   <Image Margin="0" x:Name="image_source" Source="{Binding images, Mode=TwoWay}"/>
                   <Popup>
                    <MenuItem Header="MenuItem" Height="84" Width="74">
                        <MenuItem Header="MenuItem"/>
                        <MenuItem Header="MenuItem"/>
                        <MenuItem Header="MenuItem"/>
                    </MenuItem>
                    
                   </Popup>
                </Grid>
            </Border>
        </Grid>
        <Label Content="{Binding Number_or_name_element, Mode=TwoWay}" Height="29" Margin="0,0,142,0" VerticalAlignment="Top" Foreground="#FFF7F7F7"/>
        <Button Content="Button" HorizontalAlignment="Right" Height="29" Margin="0,0,1,252" Style="{DynamicResource ButtonStyle1}" VerticalAlignment="Bottom" Width="27"/>
    </Grid>
Таким образом я подключаю контрол к Window:
XML
1
<local:MasWindow Width="340" Height="240"/>
Подскажите каким образом можно добиться перемещения контрола мышкой?

Добавлено через 3 часа 20 минут
Ни кто не занимался данным вопросом?

Добавлено через 18 часов 0 минут
Подскажите хоть кто нибудь, как можно перемещать контролы по форме с помощью мышки.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.06.2011, 16:10
Ответы с готовыми решениями:

Border в WPF - изменение размеров и перемещение
1. Подскажите, пожалуйста, как правильно реализовать следующий вариант...

Закрыть Window из UserControl
Доброе время суток! Сильно не пинать за вопрос, WPF только начал осваивать,...

Window и UserControl, разное отображение
Здравствуйте. Подскажите пожалуйста причину, решение. Может кто сталкивался. ...

Перемещение мышки в неактивном окне
Здравствуйте!! Помогите пожалуйста разобраться с неточностью в программе....

Изменение элемента посредством C#
При создании Бордера, был задан автоматический размер, как на картинке ...

11
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
06.06.2011, 11:36 2
Drag and Drop например.
0
Vangok
77 / 76 / 13
Регистрация: 21.10.2010
Сообщений: 349
06.06.2011, 19:21  [ТС] 3
Цитата Сообщение от Winsor Посмотреть сообщение
Drag and Drop например.
Не со всем то что надо, мне нужно перемещать UserControl а не DataTemplate какой-нибудь.
0
maratoss
64 / 48 / 10
Регистрация: 03.04.2011
Сообщений: 116
06.06.2011, 19:48 4
А почему готовое не хочешь использовать FloatingWindowControl например или Telerik RadWindow?
http://jevgenijpankov.heliocode.com/demo/FloatingWindowDemo.html
0
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
07.06.2011, 09:15 5
Чем отличается перемещение userControl от других элементов? Он тоже имеет Top,Bottom...
0
Vangok
77 / 76 / 13
Регистрация: 21.10.2010
Сообщений: 349
07.06.2011, 17:59  [ТС] 6
Цитата Сообщение от Winsor Посмотреть сообщение
Чем отличается перемещение userControl от других элементов? Он тоже имеет Top,Bottom...
Дело в том что этих контролов будет неизвестное количество на форме, пользователь будет сам добавлять каждый из них в какой-нибудь Canvas или ViewBox. Поэтому код на сколько я понимаю необходимо будет прописать в теле UserControla. Но вот как сделать так чтобы данный UserControl не заходил за границы ViewBox или Canvasa на форме.
0
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
07.06.2011, 18:47 7
при каждом изменении дельты, на который двигается контрол, высчитывать прямоугольник, который покрывает контрол, если его границы вылазят за текущую канву - не делать перемещение.
0
Vangok
77 / 76 / 13
Регистрация: 21.10.2010
Сообщений: 349
07.06.2011, 19:00  [ТС] 8
Как определить прямоугольник который покрывает контрол?
0
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
08.06.2011, 09:24 9
Например так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
        private Rect CalculateDragElementRect( double newHorizOffset, double newVertOffset )
//newHorizOffset,newVertOffset - новые смещения по осям
//ElementBeingDragged - элемент, которые перемещается
        {
            if( this.ElementBeingDragged == null )
                throw new InvalidOperationException( "ElementBeingDragged is null." );
 
            Size elemSize = this.ElementBeingDragged.RenderSize;
 
            double x, y;
 
            if( this.modifyLeftOffset )
                x = newHorizOffset;
            else
                x = this.ActualWidth - newHorizOffset - elemSize.Width;
 
            if( this.modifyTopOffset )
                y = newVertOffset;
            else
                y = this.ActualHeight - newVertOffset - elemSize.Height;
 
            Point elemLoc = new Point( x, y );
 
            return new Rect( elemLoc, elemSize ); //прямоугольник, покрывающий елемент
        }
 
[...skip...]
//проверка на вылезание за границы канвы
            Rect elemRect = this.CalculateDragElementRect(newHorizontalOffset, newVerticalOffset);
            if( ! this.AllowDragOutOfView )
            {
                #region Verify Drag Element Location
 
                // Get the bounding rect of the drag element.
 
 
                //
                // If the element is being dragged out of the viewable area, 
                // determine the ideal rect location, so that the element is 
                // within the edge(s) of the canvas.
                //
                bool leftAlign = elemRect.Left < 0;
                bool rightAlign = elemRect.Right > this.ActualWidth;
 
                if( leftAlign )
                    newHorizontalOffset = modifyLeftOffset ? 0 : this.ActualWidth - elemRect.Width;
                else if( rightAlign )
                    newHorizontalOffset = modifyLeftOffset ? this.ActualWidth - elemRect.Width : 0;
 
                bool topAlign = elemRect.Top < 0;
                bool bottomAlign = elemRect.Bottom > this.ActualHeight;
 
                if( topAlign )
                    newVerticalOffset = modifyTopOffset ? 0 : this.ActualHeight - elemRect.Height;
                else if( bottomAlign )
                    newVerticalOffset = modifyTopOffset ? this.ActualHeight - elemRect.Height : 0;
 
                #endregion // Verify Drag Element Location
            }
//в результате элемент просто не двигается дальше чем видимые границы.
Добавлено через 1 минуту
Полный код модуля. Гле взял - уже не помню, но за основу для передвижения элементов - очень подходит.
1
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
08.06.2011, 09:25 10
Еще раз аттач
0
Вложения
Тип файла: 7z DragCanvas.7z (4.0 Кб, 124 просмотров)
Vangok
77 / 76 / 13
Регистрация: 21.10.2010
Сообщений: 349
09.06.2011, 19:55  [ТС] 11
Цитата Сообщение от Winsor Посмотреть сообщение
Например так
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
        private Rect CalculateDragElementRect( double newHorizOffset, double newVertOffset )
//newHorizOffset,newVertOffset - новые смещения по осям
//ElementBeingDragged - элемент, которые перемещается
        {
            if( this.ElementBeingDragged == null )
                throw new InvalidOperationException( "ElementBeingDragged is null." );
 
            Size elemSize = this.ElementBeingDragged.RenderSize;
 
            double x, y;
 
            if( this.modifyLeftOffset )
                x = newHorizOffset;
            else
                x = this.ActualWidth - newHorizOffset - elemSize.Width;
 
            if( this.modifyTopOffset )
                y = newVertOffset;
            else
                y = this.ActualHeight - newVertOffset - elemSize.Height;
 
            Point elemLoc = new Point( x, y );
 
            return new Rect( elemLoc, elemSize ); //прямоугольник, покрывающий елемент
        }
 
[...skip...]
//проверка на вылезание за границы канвы
            Rect elemRect = this.CalculateDragElementRect(newHorizontalOffset, newVerticalOffset);
            if( ! this.AllowDragOutOfView )
            {
                #region Verify Drag Element Location
 
                // Get the bounding rect of the drag element.
 
 
                //
                // If the element is being dragged out of the viewable area, 
                // determine the ideal rect location, so that the element is 
                // within the edge(s) of the canvas.
                //
                bool leftAlign = elemRect.Left < 0;
                bool rightAlign = elemRect.Right > this.ActualWidth;
 
                if( leftAlign )
                    newHorizontalOffset = modifyLeftOffset ? 0 : this.ActualWidth - elemRect.Width;
                else if( rightAlign )
                    newHorizontalOffset = modifyLeftOffset ? this.ActualWidth - elemRect.Width : 0;
 
                bool topAlign = elemRect.Top < 0;
                bool bottomAlign = elemRect.Bottom > this.ActualHeight;
 
                if( topAlign )
                    newVerticalOffset = modifyTopOffset ? 0 : this.ActualHeight - elemRect.Height;
                else if( bottomAlign )
                    newVerticalOffset = modifyTopOffset ? this.ActualHeight - elemRect.Height : 0;
 
                #endregion // Verify Drag Element Location
            }
//в результате элемент просто не двигается дальше чем видимые границы.
Добавлено через 1 минуту
Полный код модуля. Гле взял - уже не помню, но за основу для передвижения элементов - очень подходит.
Последний вопрос. Данный код вставлять в сам UserControl или уже непосредственно в Window.
И чему в данном случае Rect elemRect = this.CalculateDragElementRect(newHorizontalOffset, newVerticalOffset); будут равны newVerticalOffset newHorizontalOffset, насколько понимаю положениям контрола в канве.
0
Winsor
330 / 266 / 18
Регистрация: 19.01.2011
Сообщений: 597
10.06.2011, 09:22 12
В предыдущем сообщении я выкладывал архив, в нем переопределен класс Canvas, который поддерживает перемещение любого элемента, который на него уложили. В том коде ответы на все вопросы, посмотрите внимательно. newVerticalOffset и newHorizontalOffset - это новые смещения для элемента, который двигают по канве.
1
10.06.2011, 09:22
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.06.2011, 09:22

Изменение размеров изображения
Столкнулся с такой проблемой ,например беру какое-нибудь изображение и пытаюсь...

Calendar изменение размеров
Здравствуйте! Подскажите пожалуйста как изменить размер компонента Calendar......

Изменение размеров формы
Как организовать изменение размера формы чтобы оно всегда было квадратным?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru