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

问题描述 投票:1回答:1

由于我无法通过触发器更改控件的光标(如果它被禁用),我创建了一个单独的透明边框,如果前者被禁用,则无光标显示在控件的顶部。

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

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

我想到的另一个解决方案是将所有必要的控件注册到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>
.net wpf xaml
1个回答
0
投票

我改变了一些事情,因为我意识到,如果他们共享相同的样式,那么可以使用不适合他们的触发器。

首先,我在我的资源上创建了Border:

<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>

然后将它应用于我的ui:

<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?)的回答

© www.soinside.com 2019 - 2024. All rights reserved.