Zdravím, trošku jsem pokročil ve WPF co se týká grafické podoby controlů a tak jsem si chtěl pomocí UserControl vytvořit svoje tlačítko. Vložil jsem tedy do projektu userControl se jménem UButtonStandart a nastavil vzhled. Potud je vše ok. Problém je však s nastavením některých property. Pomocí triggeru spouštím při najetí na button barevnou animaci složenou ze dvou barev. Pokud vložím názvy dvou barev přímo do setteru je vše ok. Já ale chci, aby si programátor při vložení tlačítka mohl tyto barvy zvolit. Přidal jsem tedy do tohoto userControlu dvě nové vlastnosti color1 a color2 typu string (protože jména se ve WPF zadávají stringovým názvem). Takže třída uvnitř vypadá takto:
Public Class UButtonStandart
Private _color1 As String = "Blue"
Private _color2 As String = "Black"
Public Property Color1 As String
Get
Return _color1
End Get
Set(ByVal value As String)
_color1 = value
End Set
End Property
Public Property Color2 As String
Get
Return _color2
End Get
Set(ByVal value As String)
_color2 = value
End Set
End Property
End Class
Když ve WPF vložím tlačítko, z VB kódu se na tyto property bez problémů dostanu. Problém ale je, že netuším jak se na ně dostat z triggeru. Když zkusím použít binding jako u jiné komponenty, hlásí mi to chybu a hodnotu to nenajde. Zde jsou hodnoty nastavené natvrdo a animace funguje:
<Border.Background>
<RadialGradientBrush>
<RadialGradientBrush.RelativeTransform>
<TransformGroup>
<ScaleTransform ScaleX="1.702" ScaleY="2.243"/>
<SkewTransform AngleX="0" AngleY="0"/>
<RotateTransform Angle="0"/>
<TranslateTransform X="-0.368" Y="-0.152"/>
</TransformGroup>
</RadialGradientBrush.RelativeTransform>
<GradientStop Color="Gold" Offset="0"/>
<GradientStop Color="Black" Offset="1"/>
</RadialGradientBrush>
</Border.Background>
a já bych potřeboval změnit řádky:
<GradientStop Color="Gold" Offset="0"/>
<GradientStop Color="Black" Offset="1"/>
na něco jako:
<GradientStop Color="{Binding ElementName=UButtonStandart,Path=Color1}" Offset="0"/>
<GradientStop Color="{Binding ElementName=UButtonStandart,Path=Color2}" Offset="1"/>
To ale nefunguje. Možná mám špatně ElementName, zkouším tam psát název třídy (UButtonStandart) což je ten UserControl ve kterém jsou nadefinované property Color1 a Color2. Odkazuji se na třídu a ne na konkrétní instanci. Pokud se odkážu např. na konkrétní textBox který je umístěn na formu a do kterého píšu názvy barev, tak to bez problémů funguje:
<GradientStop Color="{Binding ElementName=TextBoxColor1,Path=Text}" Offset="0"/>
<GradientStop Color="{Binding ElementName=TextBoxColor2,Path=Text}" Offset="1"/>
A pak ještě kdyby někdo věděl jak se v bindingu dostat na proměnou která je třeba nadeklarovaná ve formuláři MainWindow. (Např. na formuláři mainWindow mám proměnou IsRunning typu boolean a já chci aby její změna spouštěla trigger). Pokud na form umístím label, tak bez problémů dokážu reagovat na změnu textu v labelu, ale dostat se na proměnou je problém...
|