Создание прозрачных окон с .NET Framework 3.0 June CTP
Выпущенный недавно June CTP .NET Framework 3.0 включает в себя долгожданную возможность под названием AllowsTransparency, которая позволяет создавать полу-прозрачные закругленные окна, которых все так долго ждали…
Я написал небольшой пример, иллюстрирующий некоторых с этих новых возможностей. Основная часть примера в XAML:
<Window x:Class="WindowTransparency.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="WindowTransparency" Height="300" Width="300"
AllowsTransparency="True" WindowStyle="None"
Background="Transparent"
>
<Border CornerRadius="50" Background="Blue" Opacity=".7">
<Button Click="CloseWindow" Height="30" Width="100">Close Me
</Button>
</Border>
</Window>
Есть несколько вещей, которые стоит отметить в этом XAML. Во-первых, я позволил Window.AllowsTransparency, выставив значение «истина». Конечно, это означает лишь то, что окно может быть прозрачным. Но чтобы действительно добиться прозрачности, я поставил Window.Background на Transparency. Теперь, когда у меня есть прозрачное окно, я могу заняться содержанием. В этом примере я сделал скругленные края, чтобы заодно продемонстрировать и эту новую возможность.
Отметьте также, что Window.WindowStyle выставлено на нет. На данный момент окна с AllowsTransparency=true несовместимы с любым типом WindowStyle и ожидается, что это не станет проблемой (ведь если вы используете прозрачное окно, вряд ли вам понадобится стандартный стиль Win32). Проще простого добавить содержимое - на нашем примере я добавил кнопку закрытия окна через код Window.Close()). Также просто можно сделать окно перемещаемым. Следующий код способствует этому:
public Window1()
{
InitializeComponent();
MouseLeftButtonDown += new MouseButtonEventHandler
(Window1_MouseLeftButtonDown);
}
void Window1_MouseLeftButtonDown(object sender,
MouseButtonEventArgs e)
{
DragMove();
}
Полный пример вы можете скачать
Источник:
Перевод: Райкер
Комментарии
Шо за х...
Это же простая не вистовская монотонная прозрачка всего окна...где простите преимущества .NET 3
И чё здесь нового? А можно сделать так, чтоб кнопка прозрачной не была? А иначе это было в Visual Studio 2005.
vinc - какие именно преимущества? Уточните...
QiSoft - от такого "эксперта" по прозрачности как вы странно слышать подобные вопросы. Ответ - конечно можно
QiSoft Ха, это было не только в VS2005, это было и в 2003 и во всех остальных ООП средах по моему года с 2000ого.
Espoir Ну простите, преимущества. WinFX вот все преимущества. И всё что в это вытекало ближайшие полтора года назад.
Кстати вот по поводу .NET 3.0 June СТР.
Внятная инфа :
А вот Настоящие прозрачные окна =)
Вообщем читайте правильные средства информации например блоги в МСДН
vinc, ну зачем обязательно на американцев ссылатся? Ведь можно и на нас, тот же самый Тим Снит.
Но согласись, что виста есть виста, а ХР и реализация прозрачности через WinFX на ХР - несколько другая история.
Espoir писал:QiSoft - от такого "эксперта" по прозрачности как вы странно слышать подобные вопросы.
Это ты о чем?
vinc, А я что, должен все версии перечислять, в которых можно было прозрачность сделать? Вообще то это можно было и на VB5 с помощью API сделать.
WPF предоставляет огромное количество новых инструментов для создания инновационных пользовательских интерфейсов без завязки на тип отображаемого контента - 2d/3d, text, audio, video
Возможно некоторые скажут что прозрачность была и "в Visual Studio 2005" (хотя правильно сказать что она была в NET 2.0 если речь о VS2005), или то что ее можно реализовать на WinAPI... Ну что ж друзья - вперед! Реализуйте прозрачность, трехмерные сцены, поддержку видео в native API - только вот лично мне интересно, сколько времени на это уйдет и насколько стабильный код у вас получится.
Обсуждение такой инновационной и обширной технологии как WPF ( а не WinFX, друзья мои - хоть бы в терминах разобрались) вы сводите к обсуждению поддержки прозрачности. Хотя, лично на мой взгляд - только сейчас становится возможным полноценное разделение функций дизайнера и программиста. Посредством MS Expression Graphic Designer создается изображение -> Экспортируется в XAML - > Внедряется в WPF приложение. Примеров интеграции множество - это простейшее.
2 Espoir:
Ты вот лучше сделай так, чтобы окно(!) было полу(!)прозрачным, а элементы на нем - НЕпрозрачные. Выложи код. Тогда и поговорим. Лозунгами и рекламными материалами все кидаться умеют.
Да и не будет никто отделять дизайнера и разработчика. Дорого слишком получается. Эту "идею" не в МС придумали. Да и ОЧЕНЬ завно к тому же. Как только не разделяли, а всё равно в итоге всё возвращалось на круги своя. Только ОЧЕНЬ богатые конторы погут позволить себе такое разделение.
BlackTigerAP - в каком это смысле перевел? все что я пишу - я пишу сам
BlackTigerAP - не совсем понимаю что значит "полупрозраное окно", а по поводу элементов пожалуйста:
Указываем свойства для окна WindowStyle="None"
Background="Transparent"
AllowsTransparency = "True"
(либо в XAML либо в кострукторе NEW() )
В секции <Window.Resources> есть любое графическое изображение, например с именем MyImage01
<Window.Resources >
<DrawingImage x:Key="MyImage01">
<!-- Здесь описываем любое изображение -->
<!-- Надеюсь пример не нужен? -->
</DrawingImage>
</Window.Resources>
Далее контейнере Grid размещаем изображение, свойством Opacity задаем
любую прозрачность от 0 до 1 - например 50% = 0.5
<Grid>
<Image HorizontalAlignment ="Left"
VerticalAlignment ="Top"
Source ="{StaticResource MyImage01}"
Opacity="0.5"/>
</Grid>
В данном случае имеем окно в виде изображения MyImage01 с прозрачностью 50%
Далее размещаем кнопку в нижнем правом углу окна
<Grid>
<Image...../>
<Button Margin ="0,0,30,30"
VerticalAlignment ="Bottom"
HorizontalAlignment ="Right"
Content ="TheVista!ru"/>
</Grid>
Не знаю как разместить скриншот тут - могу на мыло скинуть - в результате имеем прозрачное окно с абсолютно непрозрачной кнопкой
Я долго не понимал смысла ваших вопросов и вот оно - прозрение
В приведенном в переводе Райкера примере кнопка размещена в составе элемента Border - именно эта рамка формирует в этом примере внешний вид окна. А так как именно ей задали прозрачность, то элементы содержащиеся в Border автоматически приняли ее свойства - в данном случае кнопка стала стольже прозрачной что и Border в котором она находится.
Достаточно разместить любой элемент вне этой рамки и можно индивидуально контролировать его внещний вид - например ту же прозрачность
Espoir,
WPF ( а не WinFX, друзья мои - хоть бы в терминах разобрались)
А что, с каких-то пор Windows Presentation Foundation (aka Avalon) перестал быть составной частью .NET Framework 3.0 (aka WinFX)?
Raiker, это было уточнение. Решение проблемы зависит от точного ее изложения.
Маленькая демонстрация на базе NET 3.0 June CTP на обсуждаемую тему, если кому-то интересно...
Для запуска необходимо установить
1. Net 3.0 June CTP (http://www.microsoft.com/downloads/details.aspx?FamilyId=8D09697E-4868-4D8D-A4CF-9B82A2AE542D&displaylang=en)
2. Windows Imaging Components (http://go.microsoft.com/fwlink/?LinkID=69301&clcid=0x409)
Если запустить не получилось - читайте информацию по правильному удалению WinFX Beta 2 на www.microsoft.com
>>Маленькая демонстрация на базе NET 3.0 June CTP на обсуждаемую тему, если кому-то интересно...
ВОТ! Это уже серьёзный разговор. А то показывают чушь какую-то и рассказывают, как всё круто.
А "размывание" добавить? ;)
Жаль, что у меня нет свободного времени на изучение WPF. Своей работы, к сожалению, по горло. Это кстати будет наибольшей проблемой для WCF/WPF. Разработчики и так уже перегружены всякими "крУтями неимоверными".
>>А "размывание" добавить?
Там если присмотреться есть размытие текста в заголовке... мне просто не хватило времени на эксперименты с цветом размытия... поэтому получилось неконтрастно
Вот реально работающий код . Окно полностью прозрачное(можно сказать его нет), а элементы непрозрачные. Спасибо автору. Поставьте свою, желательно PNG картинку и посмотрите. Можете набросать кнопок на форму. Проще скачать пример и вставить этот код.
Эксперименты проводил в Expression Blend 2.
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="WindowTransparency.Window1"
Title="WindowTransparency" Height="768" Width="1024" AllowsTransparency="True"
WindowStyle="None" Background="Transparent"
ShowInTaskbar="False" Topmost="True" WindowStartupLocation="CenterScreen" WindowState="Maximized"
>
<Image Source="bg_Слой 1.gif" Stretch="Fill"/>
</Window>
По теме
- Создаем контекстно-зависимое WPF-приложение
- #024 – Знакомство с WPF/E
- #023 – Введение в WPF, reloaded…
- #022 Введение в Microsoft Interactive Designer RC1
- #021 Применение 3D в WPF - Часть 2
- #020 Применение 3D в WPF - Часть 1
- #019 Введение в возможности 3D на WPF
- #018 Размещение контрола NET 2.0 на форме WPF
- #017 Первое Web-приложение / Подробнее о Grid / Элемент Frame
- #016 EXE, XBAP, XAML? - Все равно!