在触发器上设置控件中的样式控件

本文关键字:控件 样式 设置 触发器 | 更新日期: 2023-09-27 18:06:18

我在我的WPF应用程序中有一个LabeledTextBox,它非常简单:

<Grid x:Name="root">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>
    <TextBlock Grid.Row="0"
               Text="{Binding Label}"
               FontWeight="Bold"
               VerticalAlignment="Bottom"
               Margin="5,2,5,0"/>
    <TextBox Grid.Row="1"
             Text="{Binding Text}"
             VerticalAlignment="Top"
             Margin="5,0,5,2"/>
</Grid>

我把所有的模型都绑定到那个家伙上。我已经成功地实现了IDataErrorInfo,并且可以将LabeledTextBox设置为如下样式:

<Style TargetType="controls:LabeledTextBox">
    <Style.Triggers>
        <Trigger Property="Validation.HasError" Value="true">
            <Setter Property="BorderBrush" Value="Red"/>
            <Setter Property="BorderThickness" Value="5"/>
        </Trigger>
    </Style.Triggers>
</Style>

这一切都工作了,整个控件的边框是红色的(很明显)。我想要的是在LabeledTextBox中操纵TextBox,我的最终目标是将背景更改为柔和的红色。

当触发器设置在整个LabeledTextbox上时,我如何从触发器内访问TextBox ?

我认为这是一个看似简单的任务,我只是不能得到正确的语法。我在。net 4.0环境下工作,如果这是相关的。

谢谢!

在触发器上设置控件中的样式控件

嗨,我不认为我们可以通过样式访问元素,但是我们可以通过ControlTemplate引用。触发并指定Setter中的TargetName属性。

<Style TargetType="{x:Type wpfApplication4:LabelledTextBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type wpfApplication4:LabelledTextBox}">
                    <Grid>
                        <Grid.RowDefinitions>
                            <RowDefinition Height="Auto" />
                            <RowDefinition Height="Auto" />
                        </Grid.RowDefinitions>
                        <TextBlock
                            Grid.Row="0"
                            Margin="5,2,5,0"
                            VerticalAlignment="Bottom"
                            FontWeight="Bold"
                            Text="ergergergegr" />
                        <TextBox
                            x:Name="MyTextBox"
                            Grid.Row="1"
                            Margin="5,0,5,2"
                            VerticalAlignment="Top"
                            Text="gtwererggerg" />
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="true">
                            <Setter TargetName="MyTextBox" Property="BorderBrush" Value="Red"/>
                            <Setter TargetName="MyTextBox"  Property="BorderThickness" Value="5"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
  1. 添加一个依赖属性到你的用户控件。
  2. TextBlock Background属性绑定到该依赖项属性。
  3. 修改触发器的属性。