Форум программистов, компьютерный форум, киберфорум
C#: WPF, UWP и Silverlight
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/40: Рейтинг темы: голосов - 40, средняя оценка - 4.83
Эксперт .NET
4319 / 1980 / 385
Регистрация: 27.03.2010
Сообщений: 5,430
Записей в блоге: 1
1

Изменение размера окна перетягиванием за края. Как сделать это возможным у нестандартного окна?

30.06.2011, 23:32. Просмотров 8240. Ответов 7
Метки нет (Все метки)

Есть окно:
XML
1
2
3
4
5
6
7
8
9
10
11
12
<Window x:Class="Program.PlayerWnd"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="PlayerWnd" Height="351" Width="543"
        WindowStartupLocation="Manual" TextOptions.TextFormattingMode="Display" 
        ResizeMode="CanResizeWithGrip" WindowStyle="None" AllowsTransparency="True" Background="{x:Null}" Closed="Window_Closed" Loaded="Window_Loaded" Topmost="True">
    <Border BorderBrush="Silver" BorderThickness="1" Name="border" CornerRadius="8" Background="Black" MouseLeftButtonDown="border_MouseLeftButtonDown">
        <Grid>
 
        </Grid>
    </Border>
</Window>
Вот у него есть справа снизу треугольник, который можно таскать мышью тем самым изменять размер окна. Вот я бы хотел узнать, каким образом можно сделать, чтобы я мог изменять размер окна таская мышкой любой край окна? Вообще подскажите как это можно сделать. Любые идеи интересны.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.06.2011, 23:32
Ответы с готовыми решениями:

Как запретить изменение размера окна.
Привет всем! Я начинающий разработчик на языке C#. Я пишу свою первую более - менее серьёзную прогу...

Плавное изменение размеров окна. Как это реализуется?
Всем привет. Я тут столкнулся с проблемой касательно wpf. Заключается она вот в чем... Есть окно у...

Изменение размера обьектов при изменении размера графического окна
Можно ли в pascalABC.net сделать следующее: чтобы приизменении размера графического окна изменялись...

Qml изменение размера Canvas при изменении размера окна
Может есть какой нибудь способ, чтобы при изменении размера окна (в моем случае window) изменялся...

7
100 / 85 / 6
Регистрация: 08.04.2010
Сообщений: 169
01.07.2011, 00:11 2
у Мэтью МакДональда есть такое...
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
<Window x:Class="Windows.ModernWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="ModernWindow" Height="300" Width="300"
        AllowsTransparency="True" Background="Transparent"
        WindowStyle="None" ResizeMode="CanResizeWithGrip">
  <Border Width="Auto" Height="Auto" Name="windowFrame"
    
          BorderBrush="#395984"
          BorderThickness="1"
          CornerRadius="0,20,30,40" >
    <Border.Background>
      <LinearGradientBrush >
        <GradientBrush.GradientStops>
          <GradientStopCollection>
            <GradientStop Color="#E7EBF7" Offset="0.0"/>
            <GradientStop Color="#CEE3FF" Offset="0.5"/>
  
          </GradientStopCollection>
        </GradientBrush.GradientStops>
      </LinearGradientBrush>
    </Border.Background>
    <Grid>
 
      <Grid.RowDefinitions>
        <RowDefinition Height="Auto"></RowDefinition>
        <RowDefinition></RowDefinition>
        <RowDefinition Height="Auto"></RowDefinition>
      </Grid.RowDefinitions>
 
      <TextBlock Text="Title Bar" Margin="1" Padding="5" MouseLeftButtonDown="titleBar_MouseLeftButtonDown"></TextBlock>
        <Grid Background="#B5CBEF" Grid.Row="1">
          <Grid.RowDefinitions>
            <RowDefinition></RowDefinition>
            <RowDefinition></RowDefinition>
          </Grid.RowDefinitions>
 
          <TextBlock VerticalAlignment="Center" HorizontalAlignment="Center" Foreground="White" FontSize="20">Content Goes Here</TextBlock>
          <Button VerticalAlignment="Top" HorizontalAlignment="Center" Padding="10" Grid.Row="1" Click="cmdClose_Click">Close</Button>
          </Grid>
 
      <TextBlock HorizontalAlignment="Center" Grid.Row="2" Text="Footer" Margin="1,10,1,1" Padding="5"></TextBlock>
 
      <Rectangle Grid.RowSpan="3"
       Cursor="SizeWE" Fill="Transparent" Width="5" VerticalAlignment="Stretch" HorizontalAlignment="Right"
                 MouseLeftButtonDown="window_initiateWiden"
                 MouseLeftButtonUp="window_endWiden"
                 MouseMove="window_Widen"></Rectangle>
 
      </Grid>
    
    
  </Border>
</Window>
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
public partial class ModernWindow : System.Windows.Window
    {
 
        public ModernWindow()
        {
            InitializeComponent();
        }
 
        bool isWiden = false;
        private void window_initiateWiden(object sender, System.Windows.Input.MouseEventArgs e)
        {
            isWiden = true;
        }
        private void window_endWiden(object sender, System.Windows.Input.MouseEventArgs e)
        {
            isWiden = false;
 
            // Make sure capture is released.
            Rectangle rect = (Rectangle)sender;
            rect.ReleaseMouseCapture();
        }
 
        private void window_Widen(object sender, System.Windows.Input.MouseEventArgs e)
        {
            Rectangle rect = (Rectangle)sender;
            if (isWiden)
            {                
                rect.CaptureMouse();
                double newWidth = e.GetPosition(this).X + 5;
                if (newWidth > 0) this.Width = newWidth;
            }            
        }
 
        private void titleBar_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            this.DragMove();
        }
 
        private void cmdClose_Click(object sender, RoutedEventArgs e)
        {
            this.Close();
        }
    }
2
Эксперт .NET
4319 / 1980 / 385
Регистрация: 27.03.2010
Сообщений: 5,430
Записей в блоге: 1
03.07.2011, 13:30  [ТС] 3
Что-то ничего не получается сделать. Что только не пробовал. Не могу нормально изменить размер окна, перетаскивая за правый прямоугольник.

XAML код окна
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
<Window x:Class="WpfSizeChangeWnd.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="327" Width="579" MinHeight="225" MinWidth="300" ResizeMode="CanMinimize" WindowStartupLocation="CenterScreen" WindowStyle="None" AllowsTransparency="True" Background="{x:Null}">
    <Border BorderBrush="Silver" BorderThickness="1" Name="border" CornerRadius="8" Background="WhiteSmoke" MouseLeftButtonDown="border_MouseLeftButtonDown">
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="8" />
                <RowDefinition Height="8*" />
                <RowDefinition Height="176*" />
                <RowDefinition Height="8*" />
                <RowDefinition Height="8" />
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="8" />
                <ColumnDefinition Width="8*" />
                <ColumnDefinition Width="268" />
                <ColumnDefinition Width="8*" />
                <ColumnDefinition Width="8" />
            </Grid.ColumnDefinitions>
            <MediaElement Grid.Column="1" Grid.Row="1" Grid.RowSpan="3"  Grid.ColumnSpan="3" x:Name="mediaElement" UnloadedBehavior="Manual" LoadedBehavior="Manual" Volume="{Binding ElementName=sliderVolume, Path=Value}" />
            <StackPanel Grid.Column="2" Grid.Row="1" Grid.RowSpan="2" Grid.ColumnSpan="2"  Height="14" HorizontalAlignment="Right" Margin="0,1,5,0" Name="stPanelControlBox" Orientation="Horizontal" VerticalAlignment="Top" Width="48">
                <Button Click="btnMinimize_Click" Cursor="Hand" Height="10" Margin="5,0,0,0" Name="btnMinimize"  ToolTip="Свернуть" Width="18"  />
                <Button Click="btnClose_Click" Cursor="Hand" Height="10" Margin="5,0,0,0" Name="btnClose" ToolTip="Закрыть окно" Width="18"  />
            </StackPanel>
            <Rectangle Grid.Column="0" Grid.Row="1" Grid.RowSpan="3" Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="rectLeft" Fill="Yellow" Stroke="Black" VerticalAlignment="Stretch" Cursor="ScrollWE" />
            <Rectangle Grid.Column="5" Grid.Row="1" Grid.RowSpan="3" Grid.ColumnSpan="1" HorizontalAlignment="Stretch" Name="rectRight" Fill="Red" Stroke="Black" VerticalAlignment="Stretch" MouseLeftButtonDown="rectRight_MouseLeftButtonDown" MouseLeftButtonUp="rectRight_MouseLeftButtonUp" MouseMove="rectRight_MouseMove" Cursor="SizeWE" />
            <Rectangle Grid.Column="1" Grid.Row="0" Grid.RowSpan="1" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" Name="rectTop" Fill="Aqua" Stroke="Black" VerticalAlignment="Stretch" Cursor="SizeNS" />
            <Rectangle Grid.Column="1" Grid.Row="4" Grid.RowSpan="3" Grid.ColumnSpan="3" HorizontalAlignment="Stretch" Name="rectBottom" Fill="Green" Stroke="Black" VerticalAlignment="Stretch" Cursor="SizeNS" />
        </Grid>
    </Border>
</Window>


C# код окна
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
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
 
namespace WpfSizeChangeWnd
{
    /// <summary>
    /// Логика взаимодействия для MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
 
        private void border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DragMove();
        }
 
        private void btnClose_Click(object sender, RoutedEventArgs e)
        {
            Close();
        }
 
        private void btnMinimize_Click(object sender, RoutedEventArgs e)
        {
            WindowState = System.Windows.WindowState.Minimized;
        }
 
        private void Window_Closed(object sender, EventArgs e)
        {
            mediaElement.Stop();
            mediaElement.Close();
        }
 
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            mediaElement.Play();
        }
 
        private void Window_PreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            if (e.ChangedButton == MouseButton.Left)
            {
                if (WindowState == System.Windows.WindowState.Normal)
                {
                    WindowState = System.Windows.WindowState.Maximized;
                }
                else if (WindowState == System.Windows.WindowState.Maximized)
                {
                    WindowState = System.Windows.WindowState.Normal;
                }
            }
        }
 
        bool rightDrag = false;
        private void rectRight_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            rightDrag = true;
            ((Rectangle)sender).CaptureMouse();
        }
 
        private void rectRight_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            rightDrag = false;
            ((Rectangle)sender).ReleaseMouseCapture();
        }
 
        private void rectRight_MouseMove(object sender, MouseEventArgs e)
        {
            Rectangle rect = ((Rectangle)sender);
            if (rightDrag)
            {
                rect.CaptureMouse();
                Point point = e.GetPosition(rectRight);
                double newWidth = point.X + 2;
                if (newWidth > 0) this.Width = newWidth;
            }
        }
    }
}
0
Вложения
Тип файла: rar WpfSizeChangeWnd.rar (27.3 Кб, 81 просмотров)
Эксперт .NET
4319 / 1980 / 385
Регистрация: 27.03.2010
Сообщений: 5,430
Записей в блоге: 1
03.07.2011, 13:45  [ТС] 4
Кстати заметил, что
XML
1
MouseLeftButtonUp="rectRight_MouseLeftButtonUp"
Срабатывает в любом случае, даже если я нажму кнопку, но не отпущу её, всё равно срабатывает.
0
100 / 85 / 6
Регистрация: 08.04.2010
Сообщений: 169
03.07.2011, 14:01 5
попробуйте задать ClickMode = Release и использовать PreviewMouseLeftButtonUp. Вот здесь есть описание проблемы http://www.silverlightshow.net... ntrol.aspx, там правда для Button, не знаю действительно ли то же для Rectangle
1
Эксперт .NET
4319 / 1980 / 385
Регистрация: 27.03.2010
Сообщений: 5,430
Записей в блоге: 1
03.07.2011, 14:06  [ТС] 6
PreviewMouseLeftButtonUp не помогло. ClickMode у Rectangle нету. Ничего не понимаю. Запускаю свой проект, что выложил выше и ваш код, который вы выложили тут, то ваш работает, мой нет. Причина не ясна вообще.
0
100 / 85 / 6
Регистрация: 08.04.2010
Сообщений: 169
03.07.2011, 14:12 7
C#
1
//((Rectangle)sender).CaptureMouse();
1
Эксперт .NET
4319 / 1980 / 385
Регистрация: 27.03.2010
Сообщений: 5,430
Записей в блоге: 1
03.07.2011, 14:29  [ТС] 8
Во всём виноват был:
C#
1
2
3
4
        private void border_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            DragMove();
        }
Отписался от этого события, всё заработало. А ну и немного код изменил.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
        private void rectRight_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Rectangle rect = ((Rectangle)sender);
            rect.CaptureMouse();
        }
 
        private void rectRight_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            Rectangle rect = ((Rectangle)sender);
            rect.ReleaseMouseCapture();
        }
 
        private void rectRight_MouseMove(object sender, MouseEventArgs e)
        {
            Rectangle rect = ((Rectangle)sender);
            if (rect.IsMouseCaptured)
            {
                Point point = e.GetPosition(this);
                double newWidth = point.X + 2;
                //tBl_Point.Text = "newWidth = " + newWidth;
                if (newWidth > 0) this.Width = newWidth;
            }
        }
Теперь буду разбираться, как же опять таскать окно за любое место и чтобы работало изменение размеров.

Добавлено через 4 минуты
Всё, разобрался. Надо добавить:
C#
1
2
3
4
5
6
        private void rectRight_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
        {
            Rectangle rect = ((Rectangle)sender);
            rect.CaptureMouse();
            e.Handled = true; //Вот это, чтобы событие далее не "двигалось" по дереву
        }
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.07.2011, 14:29

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

При перетаскивании окна на рабочем столе отображается тень окна, как это убрать?
Помогите разобраться,при перетаскивании окна на рабочем столе отображается тень окна,как это...

Анимация: нарисовать зеленый квадрат, который будет двигаться от края до края окна
Здравствуйте. Нужно нарисовать зеленый квадрат, который будет двигаться от края до края окна и...

Изменение размера TableView от размера окна
Как подогнать размер tableview под размер окна, ни где не могу найти как вызвать обработчик...

Изменение размера окна
Работаю в QtCreator. Делаю приложение. Там есть главное окно (MainWindow). Туда я запихнула Plain...


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

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

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