В WPF, Как изменить правило выбора ListBox и ListView так же, как WinForms? - PullRequest
0 голосов
/ 31 марта 2011

Как изменить правило выбора ListBox и ListView так же, как WinForms?

Если в WPF уже выбран элемент в ListBox / ListView, даже если щелкнуть пустую область списка, выбор будетвсе еще осталось.В WinForm / MFC выбор не выбирается при щелчке по пустой области.

Это очень полезно, особенно для реализации.

Например, когда пользователь дважды щелкнул элемент в ListBoxодним из предпочтительных вариантов поведения является следующее: -Если пользователь дважды щелкнул по элементу, это ярлык для изменения элемента, поэтому откроется диалоговое окно конфигурации.-Если пользователь дважды щелкнул по пустому значку «а», это ярлык для добавления нового элемента, поэтому откроется диалоговое окно выбора файла.

Для реализации этого поведения предпочтительнее использовать проверку нажатия для поиска выбранного элемента.Но, поскольку хит-тест в WPF не так прост в использовании по сравнению с WinForm, самый простой способ - просто проверять выбранный элемент всякий раз, когда пользователь дважды щелкает по списку.

Сработало приложение, созданное WinForm / MFC, но не WPF из-за различий в поведении при выборе элементов списка.

Есть ли способ изменить выбор элементов списка таким же образом, как WinForm / MFC?Или я должен выбрать другой способ реализации вышеуказанного поведения?

1 Ответ

1 голос
/ 31 марта 2011

В следующем примере со списком различаются двойные щелчки по элементу и списку.

XAML:

<Window x:Class="ListBoxTest.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">

    <ListBox 
        ItemsSource="{Binding Path=Data}" 
        MouseDoubleClick="OnListBoxMouseDoubleClick">
        <ListBox.Resources>
            <Style x:Key="{x:Type ListBoxItem}" TargetType="{x:Type ListBoxItem}">
                <EventSetter Event="PreviewMouseDoubleClick" Handler="OnItemPreviewMouseDoubleClick" />
            </Style>
        </ListBox.Resources>
    </ListBox>

</Window>

Код позади:

using System;
using System.Collections.Generic;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;

namespace ListBoxTest
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();

            Data = new List<string>() { "AAA", "BBB", "CCC" };
            DataContext = this;
        }

        public List<string> Data { get; private set; }

        private void OnListBoxMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("Add new item");
        }

        private void OnItemPreviewMouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            string content = (sender as ListBoxItem).Content as string;
            MessageBox.Show("Edit " + content);
        }
    }
}
...