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;
}
它做想做的事。当单击按钮时,它确保面板现在是可见的。我想让面板多长时间都能看到。但是对于我想要强制面板显示的每个控件,我都需要这样做。
您可以使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。这样,只有当每个按钮都未按下时,您的工具按钮才会被选中。