Xaml:使用子控件触发器更改父控件属性

时间:2011-05-06 15:33:39

标签: wpf xaml triggers

我正在尝试通过子控件上的触发器修改父控件的属性。具体来说,我试图通过Border的子TextBox的OnKeyboardFocus触发器修改Border的DropShaddowEffect的不透明度。

但是,setter的TargetName会出现无法识别名称的错误。

这是XAML:

<Border x:Name="HeaderTextBoxBorder">
    <Border.Effect>
        <DropShadowEffect Opacity="20"/>                                    
    </Border.Effect>
    <TextBox x:Name="HeaderTextBox">
        <TextBox.Style>
            <Style
                TargetType="{x:Type TextBox}">
                <!-- Attmpting to change opacity on focus -->
                <Style.Triggers>
                    <Trigger
                        Property="IsKeyboardFocused"
                        Value="True">
                            <Setter
                                <!-- The error occurs here -->
                                TargetName="HeaderTextBoxBorder"
                                Property="Effect">
                                <Setter.Value>
                                    <DropShadowEffect Opacity="100"/>
                                </Setter.Value>
                            </Setter>
                    </Trigger>
                </Style.Triggers>   
            </Style>
        </TextBox.Style>
    </TextBox>
</Border>

看看XAML,有什么东西弹出不正确吗?

感谢您的时间。

2 个答案:

答案 0 :(得分:3)

Style是一个单独的名称范围,因此您无法通过它的名称访问您的边框。

您需要将Border.Effect属性绑定到TextBox.IsKeyboardFocused元素并以这种方式切换不透明度,如:

<Border.Effect>
    <DropShadowEffect Opacity="{Binding ElementName=HeaderTextBox, Path=IsKeyboardFocused, Converter={StaticResource local:CustomConverter}" />
</Border.Effect>

其中CusotmConverter实现IValueConverter并返回20或100,具体取决于布尔值。

答案 1 :(得分:0)

我很晚:) IsKeyboardFocusWithin可以用来解决这个问题。当该元素的任何子元素具有键盘焦点时,该属性将设置为true。

<Window.Resources>
    <Style x:Key="HoneydewFocus" TargetType="Border">
        <Style.Triggers>
            <Trigger Property="IsKeyboardFocusWithin" Value="true">
                <Setter Property="Background" Value="Honeydew"/>
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>

<StackPanel>
    <Border Margin="10"
            Style="{StaticResource HoneydewFocus}">
        <TextBox Width="200" Height="25" Margin="10"/>
    </Border >
</StackPanel>