NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
IT rekvalifikace s podporou uplatnění. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!

Diskuze: Globální styl pro WPF

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Jakub Lásko[Saarix]:21.7.2014 8:58

Zdravím, dělám na globální stylu pro WPF appku, ale mám problém při stylizování buttonu. Button sem nastylizoval jak jsem potřeboval, ale jakmile mu chci přidat ještě animaci po najetí myší, tak dostávám error o tom že se odkazuji na proměnnou, kterou také nastavuje Setterem, což nejde, ale nevím jakou jinou praktiku zvolit abych tu animaci rozchodil u všech buttonů v aplikaci.

Kód:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                    x:Class="Drepix_ForeignWords.ResourcesEvents">

    <Style TargetType="Button" x:Key="ButtonStyle">
        <!-- Basic style -->
        <Setter Property="Background" Value="#FF29549E" />
        <Setter Property="BorderBrush" Value="#FF272222" />
        <Setter Property="BorderThickness" Value="2" />
        <Setter Property="RenderTransform">
            <Setter.Value>
                <TransformGroup>
                    <ScaleTransform CenterX="38" CenterY="11" x:Name="traScale" />
                </TransformGroup>
            </Setter.Value>
        </Setter>
        <Style.Triggers>
            <EventTrigger RoutedEvent="MouseEnter">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="traScale"
                                         Storyboard.TargetProperty="ScaleX"
                                         To="1.2" Duration="00:00:00.8" />
                        <DoubleAnimation Storyboard.TargetName="traScale"
                                         Storyboard.TargetProperty="Scaley"
                                         To="1.2" Duration="00:00:00.8" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
            <EventTrigger RoutedEvent="MouseLeave">
                <BeginStoryboard>
                    <Storyboard>
                        <DoubleAnimation Storyboard.TargetName="traScale"
                                         Storyboard.TargetProperty="ScaleX"
                                         To="1" Duration="00:00:00.8" />
                        <DoubleAnimation Storyboard.TargetName="traScale"
                                         Storyboard.TargetProperty="Scaley"
                                         To="1" Duration="00:00:00.8" />
                    </Storyboard>
                </BeginStoryboard>
            </EventTrigger>
        </Style.Triggers>
    </Style>

</ResourceDictionary>

Nejspíše bych to viděl na to, že ten traScale budu muset pro ty všechny buttony přidávat programově a ne zde v tom stylu, aby se to nebilo.

Odpovědět
21.7.2014 8:58
Časem je vše možné.
Avatar
Jakub Lásko[Saarix]:21.7.2014 9:00

Ještě zde dodávám error:

Error   1  TargetName property cannot be set on a Style Setter. Line 22 Position 42.
Editováno 21.7.2014 9:00
Nahoru Odpovědět
21.7.2014 9:00
Časem je vše možné.
Avatar
Odpovídá na Jakub Lásko[Saarix]
sadlomaslox25:21.7.2014 16:58
<Style TargetType="Button" >
    <!-- Basic style -->
    <Setter Property="Background" Value="#FF29549E" />
    <Setter Property="BorderBrush" Value="#FF272222" />
    <Setter Property="BorderThickness" Value="2" />
    <Setter  Property="RenderTransform">
        <Setter.Value>
            <TransformGroup>
                <ScaleTransform CenterX="38" CenterY="11" />
                </TransformGroup>
        </Setter.Value>
    </Setter>
    <Style.Triggers>
        <EventTrigger RoutedEvent="MouseEnter">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                             Storyboard.TargetProperty="RenderTransform.(TransformGroup.Children)[0].ScaleX"
                             To="1.2" Duration="00:00:00.8" />
                    <DoubleAnimation
                             Storyboard.TargetProperty="RenderTransform.(TransformGroup.Children)[0].ScaleY"
                             To="1.2" Duration="00:00:00.8" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
        <EventTrigger RoutedEvent="MouseLeave">
            <BeginStoryboard>
                <Storyboard>
                    <DoubleAnimation
                             Storyboard.TargetProperty="RenderTransform.(TransformGroup.Children)[0].ScaleX"
                             To="1" Duration="00:00:00.8" />
                    <DoubleAnimation
                             Storyboard.TargetProperty="RenderTransform.(TransformGroup.Children)[0].ScaleY"
                             To="1" Duration="00:00:00.8" />
                </Storyboard>
            </BeginStoryboard>
        </EventTrigger>
    </Style.Triggers>
</Style>

odkaz se relativne viz kod

 
Nahoru Odpovědět
21.7.2014 16:58
Avatar
Odpovídá na sadlomaslox25
Jakub Lásko[Saarix]:22.7.2014 10:50

Díky moc to mě nenapadlo. Už to frčí jak má :-)

Nahoru Odpovědět
22.7.2014 10:50
Časem je vše možné.
Avatar
pcrewik
Člen
Avatar
Odpovídá na Jakub Lásko[Saarix]
pcrewik:22.7.2014 22:16

a ako si docieli toho, aby to používala celá aplikacia?
Ja som si vytvoril nový súbor style.xml, a do toho som si skopíroval ten sadlomaslox25-ov kód, síce to spustilo aplikáciu ale nezaznamenal som ziadnu zmenu oproti tomu ako to bolo predtým

 
Nahoru Odpovědět
22.7.2014 22:16
Avatar
Odpovídá na pcrewik
Patrik Valkovič:22.7.2014 22:21

Nemůžeš to dávat do XML souboru ale do resources. Pokud chceš, aby to používala celá aplikace, tak do application.re­sources

Nahoru Odpovědět
22.7.2014 22:21
Nikdy neumíme dost na to, abychom se nemohli něco nového naučit.
Avatar
Odpovídá na pcrewik
Neaktivní uživatel:22.7.2014 22:34

a když to dáš do Themes/Generic­.xaml, tak to nejde?

Nahoru Odpovědět
22.7.2014 22:34
Neaktivní uživatelský účet
Avatar
pcrewik
Člen
Avatar
pcrewik:22.7.2014 22:40

klikol som v solution explorer add resource dictionary a pridal som resource dictionary (WPF) , spustilo sa to bez zmeny, ako mám pridat do application.re­sources?

 
Nahoru Odpovědět
22.7.2014 22:40
Avatar
Odpovídá na pcrewik
sadlomaslox25:22.7.2014 22:41

ve wpf funguje tzv. visual tree, coz znamena ze vsechny gui komponenty co zobrazujes maji svoje predky a potomky (zjednodusene; aplikace->okno->listbox->polozka listboxu->tlacitko co je kaznem radku listboxu).
styl funguje tak ze pokud u neho neuvedej x:Key tak se aplikuje na vsechny elementy ktere jsou TargetType od mista, kde si definoval tento styl v Resources (zjednodusene kazdy prvek ma vlastnost Resources, kde muzes umistit dany styl a od tohoto mista smerem dolu ve wpf stromu se provadi aplikace stylu). kdyz chces aby neco bylo pouzite v cele aplikaci tak to das do souboru App.xaml do Resources.

 
Nahoru Odpovědět
22.7.2014 22:41
Avatar
pcrewik
Člen
Avatar
Odpovídá na Neaktivní uživatel
pcrewik:22.7.2014 22:56

a kde mam moznost pridat do themes?

 
Nahoru Odpovědět
22.7.2014 22:56
Avatar
Odpovídá na pcrewik
Neaktivní uživatel:22.7.2014 23:25

normálně složka Themes, soubor Generic.xaml, kde bude ResourceDictionary se stylem

Nahoru Odpovědět
22.7.2014 23:25
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Jan Vargovský:23.7.2014 1:19

Když přidáš CustomControl, tak se ti to vytvoří samo. Nebo můžeš přímo přidat Resource Dictionary.

EDIT: Má to být odpověď na pcrewik

Editováno 23.7.2014 1:20
 
Nahoru Odpovědět
23.7.2014 1:19
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.