UWP: выделение ListBoxItem - события, совпадающие с выделением - PullRequest
0 голосов
/ 12 марта 2019

У меня есть ListBox, связанный с коллекцией элементов типа Definition.Мое требование заключается в том, чтобы каждый раз, когда мышь находилась над областью шаблонного ListBoxItem, второго ListBox, открытого рядом с ListBoxItem, выявлялись подэлементы, имеющие тип 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;
}

А вотПредставление 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>

Когда указатель мыши находится над элементом Definition в DefinitionsListBox, WordsListBox должен вылететь и отобразить слова этого определения.И когда указатель выходит из этого определения и наводит курсор на новое, я хочу, чтобы WordsListBox отразил это изменение.

К сожалению, я не могу найти события, которые помогут мне достичь этого.

Я подумал, что определение PointerEntered и PointerExited в TextBox of Definition поможет, но они этого не делают, потому что PointerExited запускается НЕМЕДЛЕННО после PointerEntered, как почти одновременно, а не когда мышь выходит из области TextBox.И SelectionChanged из ListBox не срабатывает.

Первое событие должно срабатывать, когда начинается подсветка ListBoxItem, и второе, когда заканчивается выделение.

Что вы порекомендуете для этого, пожалуйста?

1 Ответ

1 голос
/ 13 марта 2019

Я думал, что определение PointerEntered и PointerExited в TextBox of Definition поможет, но они этого не делают, потому что PointerExited запускается НЕМЕДЛЕННО после PointerEntered, как почти одновременно.

Проблема в том, когда Flyout показывает на кнопке, что в окне есть слой маскирующего слоя. Это предотвратит определенное базовое событие ввода TextBox. Похоже, что PointerExited запускается сразу после PointerEntered почти одновременно.

Для решения этой проблемы вы можете установить свойство OverlayInputPassThroughElement для Flyout, чтобы область ListBox могла реагировать на событие PointerEntered PointerExited при открытии Flyout. Для получения дополнительной информации, пожалуйста, используйте следующий код.

 <Flyout x:Name="DefinitionFlyout" OverlayInputPassThroughElement="{x:Bind DefinitionsListBox}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...