簡體   English   中英

WPF綁定到觸發器中Style的目標上的屬性

[英]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確實StyleSetter ,但在StyleTriggerSetter卻沒有。

我不知道為什么它不適用於后者或如何解決它。

任何幫助是極大的贊賞!

編輯:我也嘗試{TemplateBinding Button.Foreground}{RelativeSource = {RelativeSource TemplatedParent}} ,這兩個都不起作用,所以現在的問題是: 如何在Trigger綁定Style的目標上的屬性?

Style SettersTriggers更改Content是不好的做法,它允許樣式緩存元素的各種問題,並使用與您的案例中的多個按鈕的內容相同的元素,這在wpf中是不允許的。

TriggersBinding無法工作,因為它與創建時的按鈕不在同一個可視樹中。 這就是數據錯誤告訴您的內容。

你真正想要的是改變按鈕的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM