Autor Beitrag
Exploiter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 13.11.07 15:40 
Hallo Leute,

ich habe ein Button-Template geschrieben, das einen Button erzeugt, der beim "Überfahren mit der Maus" mit einem RadialGradientBrush eingefärbt werden soll. Leider funktioniert folgender Code nicht, der Button wird lediglich durchsichtig:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
    <ControlTemplate x:Key="buttonTemplate" TargetType="Button">
        <Grid>
            <Ellipse x:Name="ellipse" StrokeThickness="4" Fill="{TemplateBinding Background}" Stroke="{TemplateBinding Foreground}"/>
            <Label Content="{TemplateBinding Content}" HorizontalAlignment="Center" VerticalAlignment="Center" Foreground="{TemplateBinding Foreground}"/>
        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="ellipse" Property="Fill"
                   <Setter.Value>
                        <RadialGradientBrush Center="0.5,0.5" GradientOrigin="0.3,0.3" RadiusX="1" RadiusY="1">
                            <RadialGradientBrush.GradientStops>
                                <GradientStop Offset="0" Color="White" />
                                <GradientStop Offset="1" Color="{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:Type Button}}}"/>
                            </RadialGradientBrush.GradientStops>
                        </RadialGradientBrush
                    </Setter.Value
                </Setter>
            </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>


Ersetze ich nun die Zeile 13 zum Beispiel durch
ausblenden XML-Daten
1:
<GradientStop Offset="1" Color="Red"/>					

funktioniert alles einwandfrei. Der Fehler muss also mit dem Binding zu tun haben (ja, die BorderBrush Eigenschaft wurde gesetzt).

Schonmal Danke im Voraus!

Mfg Exploiter

//P.S.: Mein erster Post :)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 13.11.07 15:54 
Herzlich willkommen :D

Dein Binding sucht in allen Parent-Elementen bis hinauf zum Window nach einem Button und nicht in dem Element selbst. Das würde jedenfalls passieren, wenn das Binding im Control selbst steckt, bin mir gerade nicht ganz sicher, ob das wirklich auch in einem Template passieren würde :gruebel:.
Zitat:
Refers to the ancestor in the parent chain of the data-bound element. You can use this to bind to an ancestor of a specific type or its subclasses.

Das richtige Binding hast du doch aber weiter oben schon benutzt: Per TemplateBinding bindest du an das "ge-templatete" Element.

PS: Ein misslungenes Binding sollte normalerweise auch eine Meldung ausspucken.
Exploiter Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Di 13.11.07 16:14 
Hi,

erstmal Danke für deine schnelle Antwort. Habe es auch schon mit einem TemplateBinding versucht, aber dann bekomme ich folgende Fehlermeldung, mit der ich leider nicht viel anfangen kann...

ausblenden XML-Daten
1:
 <GradientStop Offset="1" Color="{TemplateBinding BorderBrush}"/>					

Zitat:
Cannot convert the value in attribute 'Color' to object of type ''. Error at object 'System.Windows.Media.GradientStop' in markup file 'WpfApplication1;component/Skin.xaml' Line 18 Position 58.


Zitat:
Dein Binding sucht in allen Parent-Elementen bis hinauf zum Window nach einem Button und nicht in dem Element selbst. Das würde jedenfalls passieren, wenn das Binding im Control selbst steckt, bin mir gerade nicht ganz sicher, ob das wirklich auch in einem Template passieren würde

Soweit ich weiß, passiert das in einem Template nicht, denn an anderen Stellen im Code funktioniert es einwandfrei. Zum Beispiel hier:

ausblenden XML-Daten
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
  <!-- Horizontal Slider Template -->
    <ControlTemplate x:Key="horizontalSliderTemplate" TargetType="Slider">
        <Grid>

   [ ... ]

        </Grid>
        <ControlTemplate.Triggers>
            <Trigger Property="IsMouseOver" Value="True">
                <Setter TargetName="Border" Property="Background" Value="{Binding Path=BorderBrush, RelativeSource={RelativeSource AncestorType={x:Type Slider}}}"/>
               </Trigger>
        </ControlTemplate.Triggers>
    </ControlTemplate>


Nur innerhalb eines RadialGradientBrushes funktioniert das mit dem Binding aus irgendeinem Grund nicht. Benutze die Express Edition 2008 Beta, vielleicht handelt es sich ja noch um einen Bug. Kannst es ja mal bei dir ausprobieren.

Mfg Exploiter
Exploiter Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 16.11.07 19:13 
Hat keiner eine Idee, an was es noch liegen könnte? :?