WPF и слои - PullRequest
       17

WPF и слои

1 голос
/ 15 февраля 2009

Я пытаюсь выучить WPF и до сих пор мне это нравится. Однако чего-то не хватает или просто что-то, чего я не понимаю. Как мы можем отобразить несколько слоев элементов управления в WPF? Прикрепленный снимок экрана дает хорошее представление о том, что я пытаюсь сделать. У меня есть окно, и я хочу показать что-то еще поверх него. Как я могу это сделать?

Спасибо!

Снимок экрана http://www.freeimagehosting.net/uploads/3c087f7af6.png

Ответы [ 6 ]

4 голосов
/ 15 февраля 2009

Размещение двух элементов в одной строке / столбце в сетке просто накладывает их. Затем вы можете использовать видимость каждого элемента, чтобы показать / скрыть их. Так, например:

<Grid>
    ... row/column definitions
    <Grid Grid.Row="0" Grid.Column="0">
        ... main content here
    </Grid>
    <Grid Grid.Row="0" Grid.Column="0" x:Name="grid2">
        ... overlaid content here
    </Grid>
</Grid>

Теперь наложенный контент будет отображаться поверх основного контента. Установка grid2.Visibility для Visible / Hidden покажет / скроет наложенный контент.

2 голосов
/ 15 февраля 2009

Вы можете использовать слой адорнера для наложения. Это в основном поверхность рендеринга, которая перекрывает любой украшенный элемент.

2 голосов
/ 15 февраля 2009

Я могу придумать два способа достижения этого эффекта (непрямоугольное полупрозрачное наложение поверх окна, которое выходит за границы окна).

Первый вариант, НЕ ИСПОЛЬЗУЙТЕ ЭТО В КОДЕКЕ ПРОИЗВОДСТВА (AllowTransparency медленная и очень глючная) - Сделайте окно больше, чем фактическое содержимое, установите AllowsTransaprencey = "True", чтобы область "снаружи" окна была прозрачной Теперь все, что вам нужно сделать для всплывающего окна, это добавить еще один визуал в тот же контейнер, что и «окно».

Второй вариант, используйте всплывающее окно, вам нужно будет аккуратно расположить свое всплывающее окно, вызвать SetWindowRgn через interop, чтобы сделать его не прямоугольным, и вызвать функцию Win32 API, которая устанавливает значение прозрачности (извините, в настоящее время имя не запоминается ) сделать его полупрозрачным.

Первый вариант прост в реализации и будет выглядеть лучше, чем второй, но он медленнее, и вы столкнетесь со всевозможными странными ошибками (включая проблемы с некоторыми драйверами дисплея) - я знаю это по опыту, когда я переключился программное обеспечение, которое я продаю из AllowTransparency для SetWindowRgn, 90% отчетов о сбоях исчезли.

Второй вариант требует много собственных вызовов Win32 API, но он должен работать.

1 голос
/ 15 февраля 2009

Я сам не очень разбираюсь в WPF, но является ли Panel.ZIndex прикрепленным свойством, что вам нужно, возможно?

0 голосов
/ 15 февраля 2009

Вы могли бы достичь подобного эффекта, накладывая объекты в сетке (вещи просто складываются друг на друга, если они находятся в одной ячейке), но мое чувство паука подсказало бы мне, что это просто другое окно, определенное как :

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="SubWindow" Height="100" Width="100" WindowStyle="None" AllowsTransparency="True" Opacity="0.5"  >

Затем вы можете показать его в главном окне, выполнив что-то вроде:

SubWindow sw = new SubWindow ();
sw.DoModal();
0 голосов
/ 15 февраля 2009

Не совсем точно, что вы пытаетесь достичь, но из моих кратких встреч с WPF кажется, что, возможно, вы могли бы выполнить то, что вам нужно, с правильной конфигурацией отношения родитель / потомок между двумя вашими окнами. Недавно на портале д-ра Добба появился такой «привет, мир», который может дать вам некоторое руководство.

Вот ссылка на обучающее видео - Dr. TV Добба вам просто нужно выбрать видео «Построить стандартное приложение WPF» из списка ...

...