WPF 将 Setter 属性值绑定到不同样式的另一个 Setter 属性值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/19451846/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-13 09:53:43  来源:igfitidea点击:

WPF Bind Setter Property Value to another Setter Property Value in different style

wpfbindingwpf-controls

提问by Ron

I have 2 elements - window and button.
I want to bind the Window's BorderBrushValue to the Button's isPressedBackgroundValue.

我有 2 个元素 - 窗口和按钮。
我想将Window's BorderBrushValue绑定到Button's isPressedBackgroundValue。

Both elements has custom style. here are the styles:
Button Style:

两个元素都有自定义样式。这里是样式:
按钮样式:

<Style x:Key="TitleBarButton" TargetType="Button">
    <Setter Property="Foreground" Value="Black"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Padding" Value="12,8.5"/>
    <Setter Property="FocusVisualStyle" Value="{x:Null}"/>
    <Setter Property="FontFamily" Value="Marlett"/>
    <Setter Property="FontSize" Value="12"/>
    <Setter Property="SnapsToDevicePixels" Value="true"/>
    <Setter Property="IsTabStop" Value="False"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="Button">
                <Border BorderThickness="{TemplateBinding BorderThickness}" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" Padding="{TemplateBinding Padding}">
                    <Grid>
                        <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" TextBlock.FontFamily="{TemplateBinding FontFamily}" TextBlock.FontSize="{TemplateBinding FontSize}" />
                    </Grid>
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Background" Value="#EFEFF2" />
                    </Trigger>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter Property="Background" Value="#007ACC"/>
                        <Setter Property="Foreground" Value="White"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

Window Style:

窗型:

<Style TargetType="{x:Type local:MetroWindow}">
    <Setter Property="Background" Value="White"/>
    <Setter Property="WindowStyle" Value="None"/>
    <Setter Property="ResizeMode" Value="CanResize"/>
    <Setter Property="AllowsTransparency" Value="True"/>
    <Setter Property="BorderBrush" Value="#007ACC"/>
    <Setter Property="BorderThickness" Value="0.5"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:MetroWindow}">
                <Grid Name="BaseGrid" Background="{TemplateBinding Background}">
                    <Grid.RowDefinitions>
                        <RowDefinition Height="4" />
                        <RowDefinition Height="*" />
                        <RowDefinition Height="4" />
                    </Grid.RowDefinitions>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="4" />
                        <ColumnDefinition Width="*" />
                        <ColumnDefinition Width="4" />
                    </Grid.ColumnDefinitions>
                    <DockPanel LastChildFill="true" Grid.RowSpan="3" Grid.ColumnSpan="3">
                        <Border Name="TopBorder" DockPanel.Dock="Top" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        <Border Name="RightBorder" DockPanel.Dock="Right" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        <Border Name="BottomBorder" DockPanel.Dock="Bottom" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        <Border Name="LeftBorder" DockPanel.Dock="Left" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"/>
                        <DockPanel LastChildFill="True">
                            <DockPanel LastChildFill="True" DockPanel.Dock="Top">
                                <StackPanel Orientation="Horizontal" DockPanel.Dock="Right">
                                    <Button x:Name="Minimize" ToolTip="Minimize" Content="0" Style="{StaticResource TitleBarButton}"/>
                                    <Button x:Name="Restore" ToolTip="Restore" Content="2" Style="{StaticResource TitleBarButton}"  Visibility="Collapsed"/>
                                    <Button x:Name="Maximize" ToolTip="Maximize" Content="1" Style="{StaticResource TitleBarButton}"/>
                                    <Button x:Name="Close" ToolTip="Close" Content="r" Style="{StaticResource TitleBarButton}"/>
                                </StackPanel>
                                <DockPanel x:Name="TitleBar">
                                    <Border x:Name="IconBorder" Padding="5,0,0,0">
                                        <Image Width="16" Height="16" Source="{Binding Icon, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" RenderOptions.BitmapScalingMode="NearestNeighbor" RenderOptions.EdgeMode="Aliased"/>
                                    </Border>
                                    <Label x:Name="Title" VerticalAlignment="Center" FontSize="14" Content="{Binding Title, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}"/>
                                </DockPanel>
                            </DockPanel>
                            <Grid>
                                <AdornerDecorator>
                                    <ContentPresenter/>
                                </AdornerDecorator>
                            </Grid>
                        </DockPanel>
                    </DockPanel>
                    <Rectangle x:Name="TopLeftRectangle" Fill="Transparent" />
                    <Rectangle x:Name="TopRectangle" Fill="Transparent" Grid.Column="1" />
                    <Rectangle x:Name="TopRightRectangle" Fill="Transparent" Grid.Column="2" />
                    <Rectangle Name="RightRectangle" Fill="Transparent" Grid.Row="1" Grid.Column="2" />
                    <Rectangle Name="BottomRightRectangle" Fill="Transparent" Grid.Row="2" Grid.Column="2" />
                    <Rectangle Name="BottomRectangle" Fill="Transparent" Grid.Row="2" Grid.Column="1" />
                    <Rectangle Name="BottomLeftRectangle" Fill="Transparent" Grid.Row="2" />
                    <Rectangle Name="LeftRectangle" Fill="Transparent" Grid.Row="1" />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

回答by Nitin

In your Button ControlTemplate.Triggerfor IsPressedyou can bind the Backgroundin Setterlike:

在您的按钮ControlTemplate.Trigger用于IsPressed可以绑定BackgroundSetter这样的:

    <Setter Property="Background" Value="{Binding BorderBrush, RelativeSource= {RelativeSource AncestorType={x:Type local:MetroWindow}}}"/>

回答by Mahendra Apte

In your Button ControlTemplate.Triggerfor IsPressedyou can bind the Backgroundin Setter like:

在你的Button ControlTemplate.TriggerforIsPressed你可以绑定Background在 Setter 中,如:

Setter Property="Background" Value="{Binding Path=BorderBrush, RelativeSource={RelativeSource TemplatedParent}}"