如何在wpf弹出窗口中将IsOpen属性设置为True?

时间:2011-07-12 10:50:41

标签: wpf styles adorner

我有这种wpf风格:

<Style x:Key="RequiredControlTemplate">
    <Style.Setters>
        <Setter Property="Validation.ErrorTemplate">
            <Setter.Value>
                <ControlTemplate>
                    <StackPanel>
                        <Popup IsOpen="{Binding ElementName=Adorner, Path=IsMouseOver}">
                            <TextBlock Text="{Binding ElementName=Adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
                        </Popup>
                        <Border Grid.Column="1" BorderBrush="Red" BorderThickness="1" HorizontalAlignment="Stretch">
                            <AdornedElementPlaceholder Name="Adorner"/>
                        </Border>
                    </StackPanel>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style.Setters>
</Style>

我希望如果鼠标悬停在Adorner上,则弹出窗口已打开,但IsOpen="{Binding ElementName=Adorner, Path=IsMouseOver}无效...

3 个答案:

答案 0 :(得分:1)

Mode=OneWay添加到绑定中。默认情况下,IsOpen为TwoWay,只读属性不允许TwoWay绑定。

答案 1 :(得分:1)

我的风格做了一些改变。 添加了几个故事板以弹出打开...并在adorner元素上触发故事板

<Style x:Key="RequiredControlTemplate">
            <Style.Setters>
                <Setter Property="Validation.ErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <StackPanel>
                                <StackPanel.Resources>
                                    <Storyboard x:Key="OnMouseEnter1">
                                        <BooleanAimationUsingKeyFrames Storyboard.TargetProperty="(Popup.IsOpen)" Storyboard.TargetName="popup">
                                            <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
                                        </BooleanAnimationUsingKeyFrames>
                                    </Storyboard>
                                    <Storyboard x:Key="OnMouseLeave1">
                                        <BooleanAnimationUsingKeyFrames Storyboard.TargetProperty="(Popup.IsOpen)" Storyboard.TargetName="popup">
                                            <DiscreteBooleanKeyFrame KeyTime="0" Value="True"/>
                                            <DiscreteBooleanKeyFrame KeyTime="0:0:0.1" Value="False"/>
                                        </BooleanAnimationUsingKeyFrames>
                                    </Storyboard>
                                </StackPanel.Resources>
                                <Popup  Name="popup">
                                    <TextBlock Text="{Binding ElementName=Adorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}" />
                                </Popup>
                                <Border Grid.Column="1" BorderBrush="Red" BorderThickness="1" HorizontalAlignment="Stretch">
                                    <AdornedElementPlaceholder Name="Adorner">
                                        <AdornedElementPlaceholder.Triggers>
                                            <EventTrigger RoutedEvent="Mouse.MouseLeave" SourceName="Adorner">
                                                <BeginStoryboard x:Name="OnMouseLeave1_BeginStoryboard" Storyboard="{StaticResource OnMouseLeave1}"/>
                                            </EventTrigger>
                                            <EventTrigger RoutedEvent="Mouse.MouseEnter" SourceName="Adorner">
                                                <BeginStoryboard Storyboard="{StaticResource OnMouseEnter1}"/>
                                            </EventTrigger>
                                        </AdornedElementPlaceholder.Triggers>
                                    </AdornedElementPlaceholder>
                                </Border>
                            </StackPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style.Setters>
        </Style>

答案 2 :(得分:0)

如果您不遵循MVVM模式,则可以在xaml中指定x:code,您可以在其中处理MouseOver事件,并使用EventSetter附加它。