EventTrigger基于几个其他控件被给予焦点

本文关键字:焦点 控件 于几个 其他 EventTrigger | 更新日期: 2023-09-27 17:52:12

我有这个ToggleButton:

<ToggleButton x:Name="buttonStudentPicker" Content="Student Picker" HorizontalAlignment="Right" Margin="2,10,2,10" BorderThickness="0,5,0,0" Background="{x:Null}">
    <ToggleButton.LayoutTransform>
        <RotateTransform Angle="90"/>
    </ToggleButton.LayoutTransform>
    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=buttonBibleReadingMain, Path=IsFocused, Mode=OneWay}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

我有两个相关问题。首先,我实际上在界面上有几个元素,我想让这个按钮打开。目前,我只能基于一个元素想出如何做到这一点,因为我无法同时关注所有元素。本质:

If button a or button b or button c has just been clicked
    Toggle student picker button to true

相关的问题是,虽然我让它为一个控件工作,并且切换触发,但当我将焦点放在另一个控件上时,切换关闭。我真的不想那样。理想情况下,如果按钮获得焦点时开关已经关闭,那么是的,它应该再次关闭。但是如果它已经是可见的,它不应该被关闭。

理想情况下,我会使用MultiDataTrigger,但我发现所有条件都必须为真。从这里开始,我决定做一组数据触发器:

<ToggleButton x:Name="buttonStudentPicker" Content="Student Picker" HorizontalAlignment="Right" Margin="2,10,2,10" BorderThickness="0,5,0,0" Background="{x:Null}">
    <ToggleButton.LayoutTransform>
        <RotateTransform Angle="90"/>
    </ToggleButton.LayoutTransform>
    <ToggleButton.Style>
        <Style TargetType="ToggleButton">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=buttonBibleReadingMain, Path=IsPressed, Mode=OneWay}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=buttonBibleReadingClass1, Path=IsPressed, Mode=OneWay}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=buttonBibleReadingClass2, Path=IsPressed, Mode=OneWay}" Value="True">
                    <Setter Property="IsChecked" Value="True"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ToggleButton.Style>
</ToggleButton>

我想我会尝试IsPressed看看它是否有效,但这不是正确的属性使用。

我就是做不好。如果他们点击按钮,触发切换为true。但是不要做其他任何事。

清晰如泥?

更新:如果我添加一个点击处理程序到我的按钮。例子:

<Button Name="buttonBibleReadingMain" Grid.Column="1" Background="Transparent" Click="buttonBibleReadingMain_Click">
    <Image Source="Images/AssignmentTypeBibleReading.png" Margin="2"/>
</Button>

把这个放在代码后面:

private void buttonBibleReadingMain_Click(object sender, RoutedEventArgs e)
{
    buttonStudentPicker.IsChecked = true;
}

它做想做的事。当单击按钮时,它确保面板现在是可见的。我想让面板多长时间都能看到。但是对于我想要强制面板显示的每个控件,我都需要这样做。

EventTrigger基于几个其他控件被给予焦点

您可以使MultiDataTrigger像OR而不是AND一样工作,因为:

(A and B) <=> (A or B)

应用于你的代码:

<MultiDataTrigger>
    <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding ElementName=buttonBibleReadingMain, Path=IsPressed, Mode=OneWay}" Value="false" />
        <Condition Binding="{Binding ElementName=buttonBibleReadingClass1, Path=IsPressed, Mode=OneWay}" Value="false" />
        <Condition Binding="{Binding ElementName=buttonBibleReadingClass2, Path=IsPressed, Mode=OneWay}" Value="false" />
    </MultiDataTrigger.Conditions>
    <Setter Property="IsChecked" Value="false"/>
</MultiDataTrigger>

因此,您将所有true值反转为false,并设置工具按钮的默认值。IsChecked为true。这样,只有当每个按钮都未按下时,您的工具按钮才会被选中。