C# UWP:Highlight ListBoxItem-与突出显示一致的事件

C# UWP:Highlight ListBoxItem-与突出显示一致的事件,c#,xaml,mvvm,uwp,C#,Xaml,Mvvm,Uwp,我有一个绑定到类型定义项集合的列表框。我的要求是,每次鼠标悬停在模板化ListBoxItem区域上时,ListBoxItem旁边会打开第二个ListBox,显示Word类型的子项 (我基本上是使用两个列表框实现类似于TreeView的东西。这是针对早期版本的,所以使用TreeView控件不是一个选项。) 这是数据结构 public class Word { public string Name { get; set; } } public class D

我有一个绑定到类型定义项集合的列表框。我的要求是,每次鼠标悬停在模板化ListBoxItem区域上时,ListBoxItem旁边会打开第二个ListBox,显示Word类型的子项

(我基本上是使用两个列表框实现类似于TreeView的东西。这是针对早期版本的,所以使用TreeView控件不是一个选项。)

这是数据结构

public class Word
{
    public string Name { get; set; }                
}

public class Definition 
{
    public string Name { get; set }
    public ObservableCollection<Word> Words;
}

public class Dictionary
{
    public string Name { get; set }
    public ObservableCollection<Definition> Definitions;
}
公共类单词
{
公共字符串名称{get;set;}
}
公共类定义
{
公共字符串名称{get;set}
公开收集词语;
}
公共类词典
{
公共字符串名称{get;set}
公共可观测集合定义;
}
这里是XAML视图

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto"/>
        <RowDefinition Height="Auto"/>
    </Grid.RowDefinitions>  
    <Button Grid.Row="0"
        Height="0">
        <Button.Flyout>
            <Flyout x:Name="DefinitionFlyout"/>
                <ListBox x:Name="WordsListBox"                                                                                                                                                                                                                       HorizontalAlignment="Stretch">
                    <ListBox.ItemTemplate>
                        <DataTemp late x:DataType="local:Word">
                            <TextBox TextWrapping="NoWrap"                                                                                                                                                                                                                                                         
                                Height="Auto" 
                                BorderThickness="0"
                                HorizontalAlignment="Stretch"
                                Text="{x:Bind Name}"
                                TextAlignment="Left"/>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>              
            </Flyout>
        </Button.Flyout>
    </Button>
    <ListBox x:Name="DefinitionsListBox" 
        Grid.Row="1"                                                     
                SelectionMode="Single"                                                      
                HorizontalAlignment="Stretch">
                <ListBox.ItemContainerStyle>
                    <Style TargetType="ListBoxItem">
                            <Setter Property="HorizontalContentAlignment" Value="Stretch"/>
                                    <Setter Property="VerticalContentAlignment" Value="Stretch"/>                                                        
                                </Style>
                </ListBox.ItemContainerStyle>
                <ListBox.ItemTemplate>
                    <DataTemplate x:DataType="local:Definition">                                                        
                            <TextBox TextWrapping="NoWrap"                                                                     
                                    Height="Auto"                                                                  
                                        BorderThickness="0"                                                                      
                                        HorizontalAlignment="Stretch"                                                                 
                                        Text="{x:Bind Name, Mode=TwoWay}">                                                                
                                </TextBox>                                                        
                        </DataTemplate>
                </ListBox.ItemTemplate>
        </ListBox>
</Grid>

当鼠标指针悬停在DefinitionsListBox中的定义项上时,WordsListBox应该会飞出并显示该定义的单词。当指针退出该定义并将鼠标悬停在新定义上时,我希望WordsListBox反映该更改

不幸的是,我找不到有助于我实现这一目标的活动

我认为在Definition的TextBox中定义PointerEntered和pointerexitted会起作用,但事实并非如此,因为pointerexitted在PointerEntered之后立即启动,就像在几乎同时启动一样,而不是在鼠标离开TextBox区域时启动。并且ListBox的SelectionChanged不会启动

第一个事件应在ListBoxItem高亮显示开始时激发,第二个事件应在高亮显示结束时激发

请问你推荐什么

我认为在定义的文本框中定义PointerEntered和PointerExited会起到作用,但事实并非如此,因为PointerExited会在PointerEntered之后立即触发,就像在几乎同时发生的情况下一样

问题在于当按钮上显示
弹出按钮时,窗口上有遮罩层覆盖。这将阻止定义的
TextBox
的基本输入事件。它看起来几乎同时在
PointerEntered
之后立即触发
PointerEntered

为了解决这个问题,您可以为弹出按钮设置
OverlayInputPassThroughElement
属性,当弹出按钮打开时,
ListBox
区域可以响应
PointerEntered
PointerExited
事件。有关更多信息,请参阅以下代码

 <Flyout x:Name="DefinitionFlyout" OverlayInputPassThroughElement="{x:Bind DefinitionsListBox}">


它工作得非常好!非常感谢你让我意识到这一点!!这是我的荣幸。