更改EventTrigger中的可见性

时间:2012-03-16 08:24:04

标签: wpf

我的样式有可见性=隐藏的矩形。

我想在鼠标输入矩形时更改可见性。

因为矩形没有'IsMouseOver'属性我不能使用触发器。

我怎么能这样做? (如何用动画改变属性)

感谢。

4 个答案:

答案 0 :(得分:0)

我正在寻找一个写评论的按钮,但我没有找到它。 所以这里有一个答案。

两件事:

如果元素的Visisbility被隐藏,怎么可能将它的Visisbility设置为Visible?不会调用MouseEnter和MouseLeave事件。因此,IsMouseOver属性始终为False。

第二件事是,我想知道IsMouseOver属性不能在触发器中工作(我也尝试过它......并且有例外)。

另一种方法是在MouseEnter和MouseLeave上使用EventTriggers。

KR SB

答案 1 :(得分:0)

<Rectangle Width="400" Height="400" Fill="Red" Opacity="0">
        <Rectangle.Style>
            <Style TargetType="Rectangle">
                <Style.Triggers>
                    <EventTrigger RoutedEvent="MouseEnter">
                        <BeginStoryboard>
                            <Storyboard TargetProperty="Opacity">
                                <DoubleAnimation From="0" To="1" Duration="0:0:2" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="MouseLeave">
                        <BeginStoryboard>
                            <Storyboard TargetProperty="Opacity">
                                <DoubleAnimation From="1" To="0" Duration="0:0:2" />
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </Style.Triggers>
            </Style>
        </Rectangle.Style>
    </Rectangle>

答案 2 :(得分:0)

好的,总结并添加其他人写的内容:

矩形确实具有IsMouseOver属性。因此,可以创建一个可以使用此属性的触发器(在样式内)。但是,这不起作用。为什么?因为就WPF而言,如果元素不可见,则鼠标永远不会超过它。换句话说,如果元素被隐藏,IsMouseOver将始终为false。因此,当用户将鼠标放在应该放置的位置时,您无法使用它来显示元素。

如果您正在使用矩形,则还有另一种方法:您可以将矩形的颜色更改为透明,而不是使其不可见。这样,它IsMouseOver将按预期工作,以下代码(作为示例)将执行您想要的操作:

<Rectangle Width="200" Height="200">
    <Rectangle.Style>
        <Style TargetType="Rectangle">
            <Setter Property="Fill" Value="Transparent"></Setter>
            <Style.Triggers>
                <Trigger Property="IsMouseOver" Value="True">
                    <Setter Property="Fill" Value="Yellow"></Setter>
                </Trigger>
            </Style.Triggers>
        </Style>
    </Rectangle.Style>
</Rectangle>

当然,用法取决于你想要做什么,你的问题没有提到。另一种方法可能是创建另一个Rectangle,其尺寸和位置与您需要隐藏/显示的相同。这个新的Rectangle是透明的,但总是可见的。然后,您可以将Rectangle的Visibility绑定到这个新的Rectangle IsMouseOver

答案 3 :(得分:-1)

可见性有三个枚举,Visible Hidden和Collapsed,因此您无法直接绑定到bool属性或任何不属于Visibility属性的属性。您可以编写或查找转换器,在WPF可见性转换器上搜索。或者你可以试试这个:

使用tag属性并将其绑定到visibility属性,它工作正常,很简单,完全在你的样式设置器和触发器中。当然,如果你使用你的标签做其他事情哦..

在这种情况下我有两个TextBlocks,我想在鼠标进入另一个时看到一个文本块,所以当鼠标在第一个上面时,我将其tag属性更改为Visible并将第二个文本框Visibility属性绑定到第一个标签属性。

    <HierarchicalDataTemplate  ItemsSource="{Binding Children}">
                    <StackPanel Orientation="Horizontal ">
                        <TextBlock Name="TextBlockTitle" Text="{Binding Title}">
                            <TextBlock.Style>
                                <Style TargetType="{x:Type TextBlock }">
                                  <Style.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter Property="Tag" Value="Visible"/>
                                        </Trigger>
                                        <Trigger Property="IsMouseOver" Value="False">
                                            <Setter Property="Tag" Value="Hidden"/>
                                        </Trigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style></TextBlock>
                        <TextBlock Name="TextBlockAdd" Text=" + Add New" MouseLeftButtonDown="TextBlockAdd_OnMouseLeftButtonDown">
                            <TextBlock.Style>
                                <Style TargetType="{x:Type TextBlock }">
                                    <Setter Property="Visibility" Value="{Binding ElementName=TextBlockTitle,Path=Tag}"></Setter>
                                    <Style.Triggers>
                                        <Trigger Property="IsMouseOver" Value="True">
                                            <Setter Property="Visibility" Value="Visible"/>
                                        </Trigger>
                                        <EventTrigger RoutedEvent="MouseLeftButtonDown" ></EventTrigger>
                                    </Style.Triggers>
                                </Style>
                            </TextBlock.Style>
                        </TextBlock>
                    </StackPanel>

                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>