2016-05-13 81 views
1

这可能很简单。不知道,我很惊讶,我无法找到解决方案。现在我的周末开始时,我可能不在意了:P。WPF - 访问MouseOver上显示的控件

目标:TreeView,每个项目都有一个CheckBoxContent。此外,还可以选择删除TreeViewItem,该选项仅在MouseOver上显示。

问题是当我将鼠标悬停在项目上时,它触发ButtonVisibility显示出来。现在,当我尝试将鼠标移动到Button删除时,它现在得到Hidden,因为IsMouseHoverfalse

下面是示例:

<TreeView Grid.Column="2" Name="trvMenu" HorizontalAlignment="Stretch" Margin="20" MaxHeight="200" ScrollViewer.VerticalScrollBarVisibility="Auto"> 
    <TreeView.ItemTemplate> 
     <HierarchicalDataTemplate DataType="{x:Type local:TestPlan}" ItemsSource="{Binding Plans}"> 
      <StackPanel Orientation="Horizontal"> 
       <CheckBox Margin="5"/> 
       <TextBlock Text="{Binding Title}" Margin="5"/> 
       <Button Height="20" Width="20" x:Name="deletebutton" Margin="5" Visibility="Collapsed"> 
        <Image Source="/Images/cross.png" Height="20"/> 
       </Button> 
      </StackPanel> 
       <HierarchicalDataTemplate.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter TargetName="deletebutton" Property="Visibility" Value="Visible" /> 
        </Trigger> 
       </HierarchicalDataTemplate.Triggers> 
     </HierarchicalDataTemplate> 
    </TreeView.ItemTemplate> 
</TreeView> 

我需要访问ButtonMouseOver

有没有简单的方法来解决这个问题?

回答

3

我猜IsMouseOver获取TextBoxButton因为Margin之间因为你StackPanel没有Background丢失。

(如果Backgroundnull,它影响HitTestResult)

<StackPanel Background="Transparent" Orientation="Horizontal"> 

如果这还不够,取出HierarchicalDataTemplate.Triggers,除去明确设置Visibility上的按钮,使用这样的事情,而不是(风格制定者俊男t覆盖在特定条件下在XAML中设置的值):

<Button.Style> 
    <Style TargetType="Button"> 
     <Setter Property="Visibility" Value="Collapsed"></Setter> 
     <Style.Triggers> 
      <DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=StackPanel}, Path=IsMouseOver}" Value="true"> 
       <Setter Property="Visibility" Value="Visible"/> 
      </DataTrigger> 
     </Style.Triggers> 
    </Style> 
</Button.Style>