如何根据WPF XAML中的情境禁用DataTrigger?

时间:2016-01-06 06:20:45

标签: wpf xaml triggers datatrigger

  

这只是一个示例代码

在示例代码中,我有3个按钮。默认情况下,每个按钮的可见性都会折叠,鼠标悬停在相应的网格或边框中时,它将是可见的。

3个按钮的名称是

  1. SupremeButton
  2. PowerButton
  3. StarButton
  4. PowerButton有一个额外的触发器,当Button变为可见时,它会将Background颜色变为 BlueViolet 。但默认的Background颜色为 BurlyWood

    此外,还有两个DataTrigger用于在PowerButton中设置Visibility。

    • 如果SupremeButton获得Visibility Visible,那么PowerButton就会变成 可见的可见性
    • 如果StarButton获得Visibility Visible,那么PowerButton就会变成 可见的可见性

      这里我的要求是我需要禁用背景颜色的DataTrigger,以便上述两个DataTrigger获得效果。结果应为默认颜色 BurlyWood

      

    注意:不要在上述DataTrigger中添加任何条件来设置   背景颜色到BurlyWood。分享你的想法,如何绕过   DataTrigger。

    我的示例WPF XAML源代码是

    <Grid>
        <Border x:Name="m_Border" Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FFF2FFC6" Margin="0,20,0,0">
            <Button x:Name="SupremeButton" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" >
                <Button.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=m_Border, Path=IsMouseOver}" Value="false">
                                <Setter Property="Button.Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Border>
        <Grid x:Name="grid" Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FFF2FFC6" Margin="0,60,0,0">
            <Button x:Name="PowerButton" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Background="BurlyWood" Width="75" >
                <Button.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=grid, Path=IsMouseOver}" Value="false">
                                <Setter Property="Button.Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=PowerButton, Path=Visibility}" Value="Visible">
                                <Setter Property="Button.Background" Value="BlueViolet"></Setter>
                            </DataTrigger>
    
                            <!-- Visibilty is set by Outer Button -->
                            <DataTrigger Binding="{Binding ElementName=SupremeButton, Path=Visibility}" Value="Visible">
                                <Setter Property="Button.Visibility" Value="Visible"></Setter>
                            </DataTrigger>
                            <DataTrigger Binding="{Binding ElementName=StarButton, Path=Visibility}" Value="Visible">
                                <Setter Property="Button.Visibility" Value="Visible"></Setter>
                            </DataTrigger>
    
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Grid>
        <Border x:Name="n_Border" Width="100" Height="30" HorizontalAlignment="Center" VerticalAlignment="Top" Background="#FFF2FFC6" Margin="0,100,0,0">
            <Button x:Name="StarButton" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" >
                <Button.Style>
                    <Style>
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=n_Border, Path=IsMouseOver}" Value="false">
                                <Setter Property="Button.Visibility" Value="Collapsed"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </Button.Style>
            </Button>
        </Border>
    </Grid>
    

1 个答案:

答案 0 :(得分:0)

我希望我明白你需要什么。当鼠标在PowerButton上时,它将显示BlueViolet背景。当鼠标位于另外两个按钮之一时,PowerButton将显示BurlyWood背景。

这是修改后的“PowerButton”XAML: -

    <Button x:Name="PowerButton" Content="iApp" HorizontalAlignment="Center" VerticalAlignment="Center" Width="75" >
        <Button.Style>
            <Style TargetType="{x:Type Button}">
                <Setter Property="Background" Value="BlueViolet" />
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=grid, Path=IsMouseOver}" Value="false">
                        <Setter Property="Button.Visibility" Value="Collapsed"></Setter>
                    </DataTrigger>

                    <!-- Visibilty is set by Outer Button -->
                    <DataTrigger Binding="{Binding ElementName=SupremeButton, Path=Visibility}" Value="Visible">
                        <Setter Property="Button.Visibility" Value="Visible"></Setter>
                        <Setter Property="Background" Value="BurlyWood" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=StarButton, Path=Visibility}" Value="Visible">
                        <Setter Property="Button.Visibility" Value="Visible"></Setter>
                        <Setter Property="Background" Value="BurlyWood" />
                    </DataTrigger>

                </Style.Triggers>
            </Style>
        </Button.Style>
    </Button>

问题在于Background元素中的<Button>属性,我删除了该属性。 (控件的XAML中的属性值会覆盖样式和触发器中设置的任何值,因此PowerButton始终是BurlyWood)。

在我的版本中,我现在在<Style>部分内将按钮背景设置为BlueViolet。使用样式<Setter>(而不是<Button> XAML)设置默认值允许触发器覆盖该值。我还删除了触发器以将背景更改为BlueViolet,因为这现在是多余的。

其余触发器保持不变。当鼠标悬停在其他两个按钮之一时,这些会将背景更改为BurlyWood。