[英]WPF Bind to a property on the Style's target in Trigger
我希望在Button
內部有一個GeometryDrawing
,當鼠標懸停在Button
時,它會改變它的Geometry
:
<Style TargetType="{x:Type Button}">
<Setter Property="Content">
<Setter.Value>
<Rectangle>
<Rectangle.Fill>
<DrawingBrush>
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<!-- This Binding works -->
<GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
Geometry="M8,8 1,8 1,3 8,3z M9,9 0,9 0,0 9,0z" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Content">
<Setter.Value>
<Rectangle>
<Rectangle.Fill>
<DrawingBrush>
<DrawingBrush.Drawing>
<DrawingGroup>
<DrawingGroup.Children>
<!-- This Binding does not work -->
<GeometryDrawing Brush="{Binding Foreground, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Button}}}"
Geometry="M6,9 1,9 1,5 6,5z M7,10 0,10 0,3 7,3z M10,7 7,7 7,6 9,6 9,2 4,2 4,3 3,3 3,0 10,0z" />
</DrawingGroup.Children>
</DrawingGroup>
</DrawingBrush.Drawing>
</DrawingBrush>
</Rectangle.Fill>
</Rectangle>
</Setter.Value>
</Setter>
</Trigger>
</Style.Triggers>
</Style>
但是,它給了我這個錯誤
System.Windows.Data錯誤:4:無法找到綁定源,引用'RelativeSource FindAncestor,AncestorType ='System.Windows.Controls.Button',AncestorLevel ='1''。
我不知道為什么,因為Binding確實在Style
的Setter
,但在Style
的Trigger
的Setter
卻沒有。
我不知道為什么它不適用於后者或如何解決它。
任何幫助是極大的贊賞!
編輯:我也嘗試{TemplateBinding Button.Foreground}
和{RelativeSource = {RelativeSource TemplatedParent}}
,這兩個都不起作用,所以現在的問題是: 如何在Trigger
綁定Style
的目標上的屬性?
從Style
Setters
和Triggers
更改Content
是不好的做法,它允許樣式緩存元素的各種問題,並使用與您的案例中的多個按鈕的內容相同的元素,這在wpf中是不允許的。
Triggers
的Binding
無法工作,因為它與創建時的按鈕不在同一個可視樹中。 這就是數據錯誤告訴您的內容。
你真正想要的是改變按鈕的ControlTemplate
。 不同之處在於為每個具有此樣式的按鈕創建了ControlTemplate
新元素。
控制模板樣本:
<ControlTemplate x:Key="ButtonBaseControlTemplate1" TargetType="{x:Type ButtonBase}">
<Border x:Name="border" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" SnapsToDevicePixels="True">
<Grid>
<Rectangle x:Name="normalIcon">
//same as before
</Rectangle>
<Rectangle x:Name="mouseOverIcon" Visibility="Collapsed">
//same as before
</Rectangle>
<ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" Focusable="False" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
</Grid>
</Border>
<ControlTemplate.Triggers>
//other triggers from default template
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" TargetName="border" Value="#FFBEE6FD"/>
<Setter Property="BorderBrush" TargetName="border" Value="#FF3C7FB1"/>
<Setter Property="Visibility" TargetName="normalIcon" Value="Collapsed"/>
<Setter Property="Visibility" TargetName="mouseOverIcon" Value="Visible"/>
</Trigger>
//other triggers from default template
</ControlTemplate.Triggers>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.