[C# WPF] Výchozí styl a funkčnost oken

C++, C#, Visual Basic, Delphi, Perl a ostatní

Moderátor: Moderátoři Živě.cz

Odeslat příspěvekod Tepster 27. 7. 2014 22:44

Ahoj,

v aplikaci budu mít spoustu oken s různým obsahem atd. Nechci ale používat klasické windowsácké okna - chci si ho nastylovat sám. A to i tak, že si vytvořím vlastní tlačítka pro zavírání atd. a samozřejmě jejich funkčnost.

K WPF jsem přišel teprve nedávno. Dělal jsem tohle:
Vytvořil jsem si soubor typu ResourcesDictionary. Naimportoval jsem ho z App.xaml a dal do něj nějaké styly pro Window pomocí setterů a triggerů. Pak už stačilo jen vytvořit nový soubor pro Window, tomu window nastavit vlasnost Style na to, jak jsem pojmenoval Style souboru ResourcesDictionary a vše skvěle fungovalo. Takhle bych si to ve výsledku přál.

Nicméně nastal problém, když jsem chtěl vytvářet eventy. Když chci po kliknutí na nějaké předem defaultně vygenerované tlačítko zavřít okno, musím to provést v CodeBehind, jenže k tomu ResourcesDictionary jakoby žádný .cs soubor, kde bych mohl odchytávat eventy nemám. Zkoušel jsem ho i vytvořit, propojit ho s ResourceDictionary, jenže třída v něm musí dědit také z ResourcesDictionary a to už bych tam například nemohl použít this.Close() (kde "this" je Window).

Jak se tohle řeší?


Děkuji
Tepster
Junior

Odeslat příspěvekod ferrad 28. 7. 2014 05:34

Klíčové je přetížít metodu OnApplyTemplate a v ní pak dohledávat elementy pomocí GetTemplatedChild()

nejlepší je vytvořit si vlastní třídu dědící z Window k ní navázaný vlastní styl.
pro akce tlačítek minimalizace, zavření atd použíj knihovnu Microsoft.Windows.Shell
a commandy Microsoft.Windows.Shell.SystemCommands

třeba tady
http://woocoo.googlecode.com/svn/trunk/WPF/FirstFloor.ModernUI/
http://woocoo.googlecode.com/svn/trunk/WPF/FirstFloor.ModernUI/Themes/ModernWindow.xaml
http://woocoo.googlecode.com/svn/trunk/WPF/FirstFloor.ModernUI/Windows/Controls/ModernWindow.cs
ferrad
Junior

Odeslat příspěvekod Tepster 28. 7. 2014 14:25

Díky za radu. Mám tedy novou třídu, dědící z Window a na ní mám napojené normální okna.

Teď ale nevím, jak k ní navázat ty styly. Mám vytvořený soubor s ResourcesDictionary, kam budu psát ty styly, jenže jak ho mám "propojit" s tou třídou?


Díky
Tepster
Junior

Odeslat příspěvekod ferrad 28. 7. 2014 15:57

Do app.xaml pridas referenci na tvůj xaml soubor se stylem. Style i ControlTemlate musí mít jako TargetType typ tvého okna. Tímto se vše samo spojí a propoji. Když vytvaris pak instanci okna v xaml jako mainwindow už to není obyčejné <Window .... Ale <neco:MojeOkno ... Kde to "neco" je namespace toho tvého okna. Pak jeste nezapomeň v codebehind mainwindow změnit dedeni z window na tve okno

http://uloz.to/xsnVuwP5/wpfapplication2-zip
ferrad
Junior

Odeslat příspěvekod Tepster 28. 7. 2014 18:08

Skvělé!


Měl bych ještě tři otázky:

1 - V různých zdrojových kódech, různě po internetu jsem viděl, že v xaml kódu takto vytvořeného okna je "<neco:Okno..." (stejně jako u mě), ale už tam není "... Style="{StaticResources XKeyOkna}"...", což já musím ke každému oknu psát také, aby se na něj styly aplikovaly. Jak se tohle dělá?

2 - Jaký je rozdíl mezi "TargetType="neco:Okno"" a "TargetType="{x:Type neco:Okno}""?

3 - Když jsem dělal ve WinForms a také vytvářel svoje vlastní "kontrolky", někde jsem viděl, že si pro ně mohu vytvořit svoje vlastní vlastnosti, nastavit jim možné hodnoty, k čemu slouží atd. Stejně jako když v Designeru kliknu na okno a v Properties mám spoustu vlastností, které si mohu nastavit (což se dědí z Window), tak bych tam chtěl přidat nějaké své vlastnosti. Jde to?


Díky
Tepster
Junior

Odeslat příspěvekod ferrad 28. 7. 2014 18:39

1.
Kód: Vybrat vše
static ModernWindow()
{
    DefaultStyleKeyProperty.OverrideMetadata(
       typeof(ModernWindow),
       new FrameworkPropertyMetadata(typeof(ModernWindow)));
}


2.
rozdíl asi žádný ale ten x:Type používám raději

3.
vlastní vlastnsoti we WPF se nazývají DependencyProperty a AttachedProperty
http://wpftutorial.net/DependencyProperties.html
ferrad
Junior


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 0 návštevníků