Изскачащ прозорец в стил лайтбокс в WPF как?

(Опитвам се да науча WPF с помощта на уроци и документация и се опитвам да разработя потребителски интерфейс за моето пълно бекенд приложение, докато казвам. Чувал съм хора да казват, че кривата на обучение е доста стръмна. Но понякога се чудя дали какво Опитвам се да направя всъщност нещо, което е трудно да се направи в WPF, или ако е просто, но мисля в грешни термини, или ако не е нито едно от двете, е доста просто, но случайно не знам как.)

Ето моят текущ въпрос. Исках да щракна, че щракването върху част от моя потребителски интерфейс ще изведе „изскачащ прозорец“, където потребителят може да въведе повече информация. Бих искал изскачащ прозорец в стил „лайтбокс“, т.е. изскачащият прозорец е модален за страницата, затъмнява останалата част от страницата, за да стане център на вниманието и т.н. Те се виждат често на уеб сайтове.

Малко търсене ме доведе до WPF изскачащ контрол. Добавих го, сложих съдържанието си, зададох свойството IsOpen на True и -- скоро! Изскачащ прозорец. След това добавих невидим правоъгълник, който покрива целия ми прозорец, и го зададох на Visible, когато искам изскачащият ми прозорец да се отваря. Страхотен!

Така че сега исках да направя това динамично, защото понякога ще зареждам запис, който понякога ще трябва да отвори друга контрола (Потребителска контрола) в изскачащ прозорец, за да редактира информацията си. Така че си създадох метод, наречен OpenPopup. Но изглежда не мога да намеря начин да напиша този метод с помощта на WPF. В Windows Forms бих написал: (използвам VB.NET)

Sub ShowPopup (form as Form, ctrl as Control)
    'Create 'rect' as new dark rectangle control
    'Z-order it to the top
    'form.Controls.Add 'rect'
    'form.Controls.Add ctrl
    'Z-order 'ctrl' to the top
    'Center 'ctrl'
    'Set focus to it
End Sub

Но с WPF срещам проблеми:

1) Не мога да го добавя към прозореца на WPF, защото вече има дете.

2) Ако това дете е Canvas, това не е много лошо. Мога да открия това и да го добавя към Canvas. Трябва да намеря някакъв начин да задам неговите свойства Left, Top и т.н. и Width и Height, тъй като те не изглеждат свойства на контролата Rectangle, а по-скоро разширени от обекта Canvas -- в XAML те се наричат ​​Cavnas.Top и т.н., но Intellisense не ги показва, когато се опитвам да го използвам в код.

3) Но ако е StackPanel? Тогава моят правоъгълник просто ще бъде подреден под другите контроли! И не ги покрива! Има ли начин да се заобиколи това?

4) И ако прозорецът съдържа само една контрола и изобщо няма контрола на контейнер?

5) Мисля, че имаше повече проблеми, с които се сблъсках. Но да започнем с тези.

Благодаря ви предварително за помощта.


person Fred    schedule 24.03.2011    source източник


Отговори (1)


1) Не мога да го добавя към прозореца на WPF, защото вече има дете.

Ах, злините на codebehind. Решението не е да го добавите към визуалното дърво, а да го поставите във визуалното дърво, готово и чакащо да се нахвърли, но да го скриете от погледа на потребителя.

Ето пример, който можете да пуснете в Kaxaml, който демонстрира идеята. Задайте Видимостта на мрежата Lightbox на Скрито, за да получите достъп до скритото съдържание.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Grid>
        <Viewbox>
            <TextBox Text="SIMULATING CONTENT" />
        </Viewbox>
        <Grid x:Name="Lightbox" Visibility="Visible">
            <Rectangle Fill="Black" Opacity=".5"/>
            <Border
                Margin="100"
                Background="white"
                BorderBrush="CornflowerBlue"
                BorderThickness="4"
                CornerRadius="20">
                <Viewbox Margin="25">
                    <TextBox Text="SIMULATING LIGHTBOX"/>
                </Viewbox>
            </Border>
        </Grid>
    </Grid>
</Page>

2) (откъс) Intellisense не ги показва, когато се опитвам да го използвам в код.

Canvas.Top etal са Прикачени свойства. Прикачените свойства са изключително удобни и лесни за използване в XAML, но са много объркващи и трудни за използване от код. Друга причина, поради която codebehind е зло.

3) Но ако е StackPanel? Тогава моят правоъгълник просто ще бъде подреден под другите контроли! И не ги покрива! Има ли начин да се заобиколи това?

Пренасочвам ви обратно към 1. Има и много други контейнерни контроли в WPF. Трябва да ги проучите и да наблюдавате как контролират оформлението. Например, моето използване на Grid не беше да използва способността му да блокира секции от потребителския интерфейс за контроли, а способността му да наслоява контролите един върху друг и да ги разтяга до максималния им наличен размер за наличното пространство (полетата за изглед са там само за увеличаване на контролите, вместо да ги разтягат).

4) И ако прозорецът съдържа само една контрола и изобщо няма контрола на контейнер?

Коренът на прозорец почти винаги ще бъде контрола на контейнер. Но вие контролирате това, така че ако трябва да добавите контроли към визуалното дърво по време на изпълнение, можете лесно да се уверите, че детето на прозореца е контейнерна контрола, с която можете да се справите.

5) Мисля, че имаше повече проблеми, с които се сблъсках. Но да започнем с тези.

Без майтап. Моето предложение номер едно за хората във вашето положение е да изоставят това, което правите, и да научат за MVVM. Model-View-ViewModel е много прост начин за кодиране на WPF приложения, който се възползва от много от функциите на WPF-свързване на данни, шаблони, команди и т.н. Позволява ви да кодирате логиката си не в codebehind (RETCH ), но в лесни за създаване и тестване класове.

person Community    schedule 24.03.2011
comment
+1, особено за последния абзац. Подходът на OP за изучаване на WPF изглежда разумен - това е същият подход, който аз използвах - но това е наистина добър начин да прекарате няколко разочароващи месеца, през които научавате много малко за WPF. - person Robert Rossney; 24.03.2011
comment
Благодаря на всички! @Will, re #1: предпоставката на въпроса ми беше, възможно ли е това да се направи глобално за повторно използване във всеки прозорец, без да се добавя XAML или нещо друго към него. Това не е ли предимство? Re: MVVM и @Robert, благодаря за съвета. Съгласен съм и проучих MVVM и всъщност много ми харесва; Определено ще продължа по този път. Въпреки че ще се съгласите, че това няма да реши проблема, публикуван тук. - person Fred; 27.03.2011
comment
@user добре, това предполага, че вашето наслагване е капсулирано в потребителска контрола. Създаването на действителен контрол, който взаимодейства с потребителския интерфейс чрез код, е експоненциално по-сложно... - person ; 27.03.2011