Используйте WPF. Вот что я делаю…
Униформа.xaml
<!--
********************************************************************************************************
********************************************************************************************************
*** ***
*** Code Copyright © 2020, Will `Willow' Osborn. ***
*** ***
*** This code is provided 'AS IS, NO WARRANTY' and is intended for no specific use or person. ***
*** In fact, the code herein is so confuggled, it should not be used by ANYONE EVER and ANYTHING ***
*** that happens as a result of its use is COMPLETELY and UTTERLY YOUR FAULT. :p ***
*** ***
*** You have my permission to extract, copy, modify, steal, borrow, beg, fold, spindle, mutilate or ***
*** otherwise abuse the code herein PROVIDED YOU LEAVE ME OUT OF IT! You Acknowledge and Accept ***
*** FULL and SOLE responsibility and culpability for ANYTHING you do with or around it. ***
*** ***
********************************************************************************************************
********************************************************************************************************
-->
<Window x:Class="WillPower.UniForm"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
SizeToContent="WidthAndHeight"
AllowsTransparency="True"
Background="Transparent"
WindowStyle="None"
WindowStartupLocation="CenterScreen"
Topmost="True"
SizeChanged="Window_SizeChanged"
MouseDown="Window_MouseDown"
Closing="Window_Closing" >
<Window.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="HorizontalContentAlignment" Value="Center"/>
<Setter Property="VerticalContentAlignment" Value="Center"/>
<Setter Property="Padding" Value="2"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<Grid x:Name="grid">
<Border x:Name="border"
CornerRadius="8"
BorderBrush="#FF000000"
BorderThickness="1">
<Border.Background>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.4" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Border.Background>
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"
TextElement.FontWeight="Bold"/>
</Border>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" TargetName="border">
<Setter.Value>
<RadialGradientBrush GradientOrigin="0.496,1.052">
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform CenterX="0.5" CenterY="0.5" ScaleX="1.5" ScaleY="1.5"/>
<TranslateTransform X="0.02" Y="0.3"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Offset="1" Color="#00000000"/>
<GradientStop Offset="0.3" Color="#FFFFFFFF"/>
</RadialGradientBrush>
</Setter.Value>
</Setter>
</Trigger>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="BorderBrush" TargetName="border" Value="#FF454545"/>
</Trigger>
<Trigger Property="IsEnabled" Value="False">
<Setter Property="Opacity" TargetName="grid" Value="0.35"/>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Window.Resources>
<WindowChrome.WindowChrome>
<WindowChrome GlassFrameThickness="0" CornerRadius="20" CaptionHeight="0"/>
</WindowChrome.WindowChrome>
<Border BorderBrush="Transparent" BorderThickness="0" CornerRadius="20">
<Border.Background>
<LinearGradientBrush EndPoint="0.504,5.0" StartPoint="0.504,0.03">
<GradientStop x:Name="FadeFrom" Color="WhiteSmoke" Offset="0"/>
<GradientStop x:Name="FadeTo" Color="#FF34099D" Offset="0.4"/>
</LinearGradientBrush>
</Border.Background>
<Grid Margin="6,6,6,6"
Height="Auto"
Width="Auto"
MinWidth="200"
HorizontalAlignment="Center">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Button x:Name="CloseWindow"
Grid.Row="0"
Grid.Column="2"
Grid.ColumnSpan="3"
Content="X"
Width="22"
Height="22"
Margin="1"
ToolTip="Close"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Click="CloseWindow_Click"/>
<Button x:Name="MaxWindow"
Grid.Row="0"
Grid.Column="2"
Grid.ColumnSpan="3"
Content="^"
Width="22"
Height="22"
Margin="0,1,23,0"
ToolTip="Maximize"
HorizontalAlignment="Right"
VerticalAlignment="Top" Click="MaxWindow_Click"/>
<Button x:Name="MinWindow"
Grid.Row="0"
Grid.Column="2"
Grid.ColumnSpan="3"
Content="__"
Width="22"
Height="22"
Margin="0,1,45,0"
ToolTip="Minimize"
HorizontalAlignment="Right"
VerticalAlignment="Top" Click="MinWindow_Click"/>
<Label x:Name="Caption"
Grid.Row="0"
Grid.Column="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Center"
VerticalAlignment="Top"
Margin="20,-4,67,0"
FontSize="24"
FontWeight="Bold"
Content="Title" FontFamily="Rockwell"/>
<Grid x:Name="SurfaceGrid"
Grid.Row="1"
Grid.Column="0"
Grid.ColumnSpan="3"
HorizontalAlignment="Center"
Width="Auto"
Height="Auto"
VerticalAlignment="Center">
<!--This is where the remaining content goes. Just set the FormContent property.-->
</Grid>
</Grid>
</Border>
</Window>
UniForm.xaml.cs
//
// ********************************************************************************************************
// ********************************************************************************************************
// *** ***
// *** Code Copyright © 2020, Will `Willow' Osborn. ***
// *** ***
// *** This code is provided 'AS IS, NO WARRANTY' and is intended for no specific use or person. ***
// *** In fact, the code herein is so confuggled, it should not be used by ANYONE EVER and ANYTHING ***
// *** that happens as a result of its use is COMPLETELY and UTTERLY YOUR FAULT. :p ***
// *** ***
// *** You have my permission to extract, copy, modify, steal, borrow, beg, fold, spindle, mutilate or ***
// *** otherwise abuse the code herein PROVIDED YOU LEAVE ME OUT OF IT! You Acknowledge and Accept ***
// *** FULL and SOLE responsibility and culpability for ANYTHING you do with or around it. ***
// *** ***
// ********************************************************************************************************
// ********************************************************************************************************
//
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace WillPower
{
/// <summary>
/// Interaction logic for UniForm.xaml
/// </summary>
public sealed partial class UniForm : Window
{
/// <summary>
/// The mood of the window.
/// </summary>
public MessageBoxImage Mood
{
get
{
return pvMood;
}
set
{
pvMood = value;
this.ColorFadeBottom = value.GetMood();
}
}
private MessageBoxImage pvMood = MessageBoxImage.None;
/// <summary>
/// The topmost background (fade from)
/// </summary>
public GradientStop ColorFadeTop
{
get
{
return Application.Current.Invoke(delegate
{ return this.FadeFrom; });
}
set
{
Application.Current.Invoke(delegate
{ this.FadeFrom = value; });
}
}
/// <summary>
/// The bottommost background (fade to)
/// </summary>
public GradientStop ColorFadeBottom
{
get
{
return Application.Current.Invoke(delegate
{ return this.FadeTo; });
}
set
{
Application.Current.Invoke(delegate
{ this.FadeTo = value; });
}
}
/// <summary>
/// The title label, completely accessible and modifiable.
/// </summary>
public Label TitleLabel
{
get
{
return Application.Current.Invoke(delegate
{ return this.Caption; });
}
set
{
Application.Current.Invoke(delegate
{ this.Caption = value; });
}
}
/// <summary>
/// The form title.
/// </summary>
public new string Title
{
get
{
return Application.Current.Invoke(delegate
{ return this.Caption.Content?.ToString(); });
}
set
{
Application.Current.Invoke(delegate
{ this.Caption.Content = value; });
}
}
/// <summary>
/// the Control Box Minimize Button.
/// </summary>
public Button MinimizeButton
{
get
{
return this.MinWindow;
}
set
{
this.MinWindow = value;
}
}
/// <summary>
/// the Control Box Maximize Button.
/// </summary>
public Button MaximizeButton
{
get
{
return this.MaxWindow;
}
set
{
this.MaxWindow = value;
if (this.MaxWindow.Visibility == Visibility.Hidden)
{
this.MinWindow.Margin = new Thickness(0, 1, 23, 0);
}
else
{
this.MinWindow.Margin = new Thickness(0, 1, 45, 0);
}
}
}
/// <summary>
/// the Control Box Close Button.
/// </summary>
public Button CloseButton
{
get
{
return this.CloseWindow;
}
set
{
this.CloseWindow = value;
}
}
/// <summary>
/// The Content portion of the Window. Can be any UIElement,
/// such as another Window or a Control.
/// </summary>
public UIElement FormContent
{
get
{
if (this.SurfaceGrid.Children.Count < 1)
{
return null;
}
return this.SurfaceGrid.Children[0];
}
set
{
if (this.SurfaceGrid.Children.Count > 0)
{
this.SurfaceGrid.Children.Clear();
}
this.SurfaceGrid.Children.Add(value);
}
}
/// <summary>
/// Creates a new Instance of UniForm.
/// </summary>
public UniForm()
{
InitializeComponent();
this.CloseWindow.ToolTip = UI.Dialogs.Properties.Resources.Close;
this.MaxWindow.ToolTip = UI.Dialogs.Properties.Resources.Maximize;
this.MinWindow.ToolTip = UI.Dialogs.Properties.Resources.Minimize;
}
/// <summary>
/// Creates a new Instance of UniForm.
/// </summary>
/// <param name="style">System.Windows.WindowStyle.</param>
public UniForm(WindowStyle style) : this()
{
switch (style)
{
case WindowStyle.ToolWindow:
this.MaxWindow.Visibility = Visibility.Hidden;
this.MinWindow.Visibility = Visibility.Hidden;
break;
case WindowStyle.None:
this.MaxWindow.Visibility = Visibility.Hidden;
this.MinWindow.Visibility = Visibility.Hidden;
this.CloseWindow.Visibility = Visibility.Hidden;
break;
}
}
/// <summary>
/// Creates a new Instance of UniForm.
/// </summary>
/// <param name="childForm">System.Windows.UIElement; The Content portion of the Window.</param>
/// <param name="style">System.Windows.WindowStyle.</param>
public UniForm(UIElement childForm, WindowStyle style) : this(style)
{
this.FormContent = childForm;
}
/// <summary>
/// Creates a new Instance of UniForm.
/// </summary>
/// <param name="childForm">System.Windows.UIElement; The Content portion of the Window.</param>
public UniForm(UIElement childForm) : this()
{
this.FormContent = childForm;
}
/// <summary>
/// Closes this Window safely.
/// </summary>
public void CloseFromChild()
{
Application.Current.DisposeOf(this);
}
private void CloseWindow_Click(object sender, RoutedEventArgs e)
{
Application.Current.DisposeOf(this);
}
private void MinWindow_Click(object sender, RoutedEventArgs e)
{
Application.Current.Invoke(delegate
{
this.WindowState = WindowState.Minimized;
});
}
private void MaxWindow_Click(object sender, RoutedEventArgs e)
{
Application.Current.Invoke(delegate
{
if (this.WindowState == WindowState.Maximized)
{
this.WindowState = WindowState.Normal;
}
else
{
this.WindowState = WindowState.Maximized;
}
});
}
private void Window_SizeChanged(object sender, SizeChangedEventArgs e)
{
Application.Current.Invoke(delegate
{
if (this.WindowState == WindowState.Maximized)
{
this.MaxWindow.Content = "L";
this.MaxWindow.ToolTip = UI.Dialogs.Properties.Resources.RestoreDown;
}
else
{
this.MaxWindow.Content = "^";
this.MaxWindow.ToolTip = UI.Dialogs.Properties.Resources.Maximize;
}
});
}
private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
if (typeof(Window) == this.FormContent?.GetType())
{
Application.Current.DisposeOf(this.FormContent as Window);
}
}
private void Window_MouseDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
if (e.ChangedButton == System.Windows.Input.MouseButton.Left)
{
this.DragMove();
}
}
}
}
Основные свойства форм
Последнее обновление: 31.10.2015
С помощью специального окна Properties (Свойства) справа Visual Studio предоставляет нам удобный интерфейс для управления свойствами элемента:
Большинство этих свойств оказывает влияние на визуальное отображение формы. Пробежимся по основным свойствам:
-
Name: устанавливает имя формы — точнее имя класса, который наследуется от класса
Form
-
BackColor: указывает на фоновый цвет формы. Щелкнув на это свойство, мы сможем выбрать тот цвет, который нам подходит
из списка предложенных цветов или цветовой палитры -
BackgroundImage: указывает на фоновое изображение формы
-
BackgroundImageLayout: определяет, как изображение, заданное в свойстве BackgroundImage, будет располагаться на форме.
-
ControlBox: указывает, отображается ли меню формы. В данном случае под меню понимается меню самого верхнего уровня, где
находятся иконка приложения, заголовок формы, а также кнопки минимизации формы и крестик. Если данное свойство имеет значение false, то мы не увидим
ни иконку, ни крестика, с помощью которого обычно закрывается форма -
Cursor: определяет тип курсора, который используется на форме
-
Enabled: если данное свойство имеет значение false, то она не сможет получать ввод от пользователя, то есть мы не сможем
нажать на кнопки, ввести текст в текстовые поля и т.д. -
Font: задает шрифт для всей формы и всех помещенных на нее элементов управления. Однако, задав у элементов формы свой шрифт,
мы можем тем самым переопределить его -
ForeColor: цвет шрифта на форме
-
FormBorderStyle: указывает, как будет отображаться граница формы и строка заголовка. Устанавливая данное свойство в None
можно создавать внешний вид приложения произвольной формы -
HelpButton: указывает, отображается ли кнопка справки формы
-
Icon: задает иконку формы
-
Location: определяет положение по отношению к верхнему левому углу экрана, если для свойства
StartPosition
установлено значениеManual
-
MaximizeBox: указывает, будет ли доступна кнопка максимизации окна в заголовке формы
-
MinimizeBox: указывает, будет ли доступна кнопка минимизации окна
-
MaximumSize: задает максимальный размер формы
-
MinimumSize: задает минимальный размер формы
-
Opacity: задает прозрачность формы
-
Size: определяет начальный размер формы
-
StartPosition: указывает на начальную позицию, с которой форма появляется на экране
-
Text: определяет заголовок формы
-
TopMost: если данное свойство имеет значение
true
, то форма всегда будет находиться поверх других окон -
Visible: видима ли форма, если мы хотим скрыть форму от пользователя, то можем задать данному свойству значение
false
-
WindowState: указывает, в каком состоянии форма будет находиться при запуске: в нормальном, максимизированном или минимизированном
Программная настройка свойств
С помощью значений свойств в окне Свойства мы можем изменить по своему усмотрению внешний вид формы, но все то же самое мы можем сделать
динамически в коде. Перейдем к коду, для этого нажмем правой кнопкой мыши на форме и выберем в появившемся контекстном меню View Code (Просмотр кода). Перед нами открывается файл кода
Form1.cs. Изменим его следующим образом:
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace HelloApp { public partial class Form1 : Form { public Form1() { InitializeComponent(); Text = "Hello World!"; this.BackColor = Color.Aquamarine; this.Width = 250; this.Height = 250; } } }
В данном случае мы настроили несколько свойств отображения формы: заголовок, фоновый цвет, ширину и высоту.
При использовании конструктора формы надо учитывать, что весь остальной код должен идти после вызова метода InitializeComponent()
, поэтому все установки свойств
здесь расположены после этого метода.
Установка размеров формы
Для установки размеров формы можно использовать такие свойства как Width/Height или Size. Width/Height принимают числовые значения, как в вышеприведенном
примере. При установке размеров через свойство Size, нам надо присвоить свойству объект типа Size:
this.Size = new Size(200,150);
Объект Size в свою очередь принимает в конструкторе числовые значения для установки ширины и высоты.
Начальное расположение формы
Начальное расположение формы устанавливается с помощью свойства StartPosition
, которое может принимать одно из следующих значений:
-
Manual: Положение формы определяется свойством Location
-
CenterScreen: Положение формы в центре экрана
-
WindowsDefaultLocation: Позиция формы на экране задается системой Windows, а размер определяется свойством Size
-
WindowsDefaultBounds: Начальная позиция и размер формы на экране задается системой Windows
-
CenterParent: Положение формы устанавливается в центре родительского окна
Все эти значения содержатся в перечислении FormStartPosition
, поэтому, чтобы, например, установить форму в центре экрана, нам надо прописать
так:
this.StartPosition = FormStartPosition.CenterScreen;
Фон и цвета формы
Чтобы установить цвет как фона формы, так и шрифта, нам надо использовать цветовое значение, хранящееся в структуре Color:
this.BackColor = Color.Aquamarine; this.ForeColor = Color.Red;
Кроме того, мы можем в качестве фона задать изображение в свойстве BackgroundImage
, выбрав его в окне свойств или в коде, указав путь к изображению:
this.BackgroundImage = Image.FromFile("C:\Users\Eugene\Pictures\3332.jpg");
Чтобы должным образом настроить нужное нам отображение фоновой картинки, надо использовать свойство BackgroundImageLayout
,
которое может принимать одно из следующих значений:
-
None: Изображение помещается в верхнем левом углу формы и сохраняет свои первоначальные значения
-
Tile: Изображение располагается на форме в виде мозаики
-
Center: Изображение располагается по центру формы
-
Stretch: Изображение растягивается до размеров формы без сохранения пропорций
-
Zoom: Изображение растягивается до размеров формы с сохранением пропорций
Например, расположим форму по центру экрана:
this.StartPosition = FormStartPosition.CenterScreen;
4 ответа
К сожалению, поскольку граница формы выводится операционной системой, эта представляет собой сложную задачу. Это не так.
НЕ нажимайте ссылку ProjectDistributor на странице CodePlex ниже
CodePlex Project для рисования пользовательских границ делает это очень просто. Просто создайте форму с помощью SkinnedForm из этого проекта вместо стандартной формы, и она должна работать — вам действительно не нужно ничего делать в вашем коде.
Reed Copsey
18 сен. 2009, в 17:53
Поделиться
Вы можете установить для параметра FormBorderStyle значение None,
затем оставьте форму с панелью и оставьте некоторое пространство для границы,
теперь вы можете установить цвет, который хотите для границы, в качестве цвета обратной формы,
теперь панель служит основным контейнером, и вы можете изменить фон так, как хотите, и форма служит границей!
- он даст вам следующее:
Essam Mohamed
05 авг. 2017, в 21:17
Поделиться
Ниже «ForeColor» их должен быть параметр под названием «FormBorderStyle». Вы можете отредактировать его с помощью VisualStudio 2015. Или вы можете идти по пути панели управления, должно быть что-то вроде «Панель управленияВнешний вид и ПерсонализацияПерсонализация»,
их будет второй параметр под названием «Цвет», который может изменить тот цвет, который вы хотите, чтобы он изменил цвет рамки во всех программах на цвет, который вы установили.
LunaDev
06 апр. 2017, в 19:53
Поделиться
if (colorDialog1.ShowDialog() == DialogResult.OK)
{
string color = Convert.ToString(colorDialog1.Color);
MessageBox.Show("You change the color " + color);
this.BackColor = colorDialog1.Color; // BackColor is only accessible for this form
}
Baqar Hassan
12 апр. 2012, в 20:15
Поделиться
Ещё вопросы
- 0диалоговое окно отображается автоматически при загрузке веб-страницы
- 0Динамически добавлять <td> в таблицу
- 0Включить PHP-файл в шаблон TemplaVoilà через TypoScript
- 1Как убить текущий процесс страницы
- 0Модальный не работает в IE9 — при открытии инструментов разработчика он работает нормально
- 0Вызов функции директивы внутри другой директивы
- 1Как получить токен на предъявителя в консольном приложении .Net?
- 0получить строку между двумя словами со страницы в php
- 0Передача информации в функцию обработки ответов jQuery ajax
- 0AngularJS и иерархия охвата
- 0Ошибка: недопустимое значение для <path> attribute d = «.. для круговой диаграммы
- 0Форма адреса, почтовый индекс, автозаполнение запроса https и обходной путь CORS
- 0Я получаю «неопределенный тип» в моей реализации cvSnakeImage ()
- 0Разнесите строку, чтобы получить ключевые слова (ключевые слова канала Youtube)
- 0PHP: как обработать файлы по алфавиту, используя DirectoryIterator?
- 0HTML-оператор выбора и кнопка не работают с PayPal
- 0Как изменить положение контроллера на Google Maps
- 0Проблемы с выравниванием содержимого по сетке
- 0написание универсального стекового класса на c ++
- 0каталог openshift «www»?
- 1Проверка MVC с другой ViewModel
- 0Как использовать контроллер для шаблона в конфигурации маршрутизации?
- 1В Java, когда один из методов в объекте «синхронизирован», все ли методы «синхронизированы»?
- 1Не удается импортировать сертификаты настроек Azure PUSBLISH в приложение Windows Phone 8.1
- 1Kindle — лучший способ сохранить изображения
- 0Пожалуйста, подождите, пока панель загрузки при нажатии кнопки не отображается
- 0Настройка значений нескольких параметров в запросе Sql
- 1Spring 4 websocket и stomp — контроллер не достигнут
- 0HTML таблица с всплывающим javascript
- 1Кнопка меню не работает на эмуляторе в приложении Карт
- 0Как читать текст из текстового поля с C ++
- 0Ошибка создания одного класса в форме C ++
- 1Необходимо экспортировать несколько диктов данных в Excel на основе общего ключа.
- 0Разделить таблицу Mysql на столбец даты и сохранить результат в разных таблицах с динамическим именем
- 1Как игнорировать поле в базе данных с Java-запросом sql Netbeans
- 1Как передать значения флажков из JavaScript / представления в контроллер в MVC?
- 1Общий тег Debug / Release в файле csproj
- 1Python Flask: нажатие кнопки ничего не делает
- 1Отправить сообщение через фильтр намерений
- 1Получение правильных заголовков таблицы с векторами jswing
- 1Как сохранить изменения в свойствах навигации с помощью Entity Framework
- 1Пользовательские свойства файла в Dropbox Core API?
- 0Получение Gibberish на выходе phpmyadmin
- 0Проблема кодирования CSS с моим логотипом и встроенным блоком навигации не выстраиваются
- 1Поддержка SDL на базе Android и Windows Phone
- 1Как отправить данные для нескольких действий контролируемым образом в Android?
- 0Карусель Flexslider / Fancybox изображения исчезают
- 1Крайонет не получает пользовательские классы
- 0Как сортировать четные и нечетные числа поочередно с ограничением времени и сложности пространства (C / C ++)
- 1Почему часы Webpack не работают?