使用触发器时,如何获得控件的样式以指向其同级控件?

时间:2019-04-21 07:10:04

标签: .net wpf xaml

由于如果禁用了控件,则无法通过触发器来更改其光标,因此,如果禁用了该控件,则我创建了一个单独的透明边框,其中没有光标显示在控件顶部。

我想缩短代码,所以我创建了一个自定义边框样式,定义了我需要的所有内容,并希望将其应用于所需的每个取消边框,但是问题是它依赖于数据触发器,该触发器指向禁用了控件的名称它显示出来,所以现在我的问题是,我可以告诉样式“检查网格中的同级控件并检查是否启用/禁用”的最佳方法是什么。

到目前为止,我一直尝试创建多个指向控件名称的数据触发器,但发现它有点混乱。另外,我希望将其用于整个应用程序,所以如果我可以简单地创建边框并应用样式而无需转到实际样式并创建另一个触发器,那将是很好的选择。

我想到的另一个解决方案是将所有必需的控件注册到IsEnabled_Changed事件,然后从那里进行同级搜索,并根据前者的IsEnabled状态设置后者的可见性。

这是样式的示例:

<Style x:Key="CancelBorder_Style" TargetType="Border">
    <Setter Property="BorderThickness" Value="0"/>
    <Setter Property="Background" Value="Transparent"/>
    <Setter Property="CornerRadius" Value="{DynamicResource GlobalCornerRadius}"/>
    <Setter Property="Cursor" Value="No"/>
    <Setter Property="Visibility" Value="Collapsed"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding ElementName=MiddleNameTB,Path=IsEnabled}" Value="False">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

这是边界及其同级的示例:

<Grid Style="{DynamicResource RegCtrlGrid_Style}" >
    <TextBox x:Name="MiddleNameTB" />
    <Border Style="{DynamicResource CancelBorder_Style}"/>
</Grid>

1 个答案:

答案 0 :(得分:0)

我做了两件事,因为我意识到,如果他们共享相同的样式,那么就可以使用一个不适合他们的触发器。

首先,我在资源上创建了边框:

<Border x:Key="CancelBorder" x:Shared="False">
    <Border.Style>
        <Style TargetType="Border" >
            <Setter Property="BorderThickness" Value="0"/>
            <Setter Property="Background" Value="Transparent"/>
            <Setter Property="CornerRadius" Value="{DynamicResource GlobalCornerRadius}"/>
            <Setter Property="Cursor" Value="No"/>
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Children[0].IsEnabled,RelativeSource={RelativeSource AncestorType=Grid}}" Value="False">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Border.Style>
</Border>

然后将其应用于我的用户界面:

<Grid Grid.Row="2" Style="{DynamicResource RegCtrlGrid_Style}">
    <TextBox x:Name="MiddleNameTB"/>
    <StaticResource ResourceKey="CancelBorder"/>
</Grid>

诀窍是使用:

{Binding Path=Children[0].IsEnabled,RelativeSource={RelativeSource AncestorType=Grid}}

其中[0]是基于父项下子项的索引

非常感谢Jason Frank在(In WPF, is there a way to bind to sibling properties?)上的回答