WPF - Как добавить событие щелчка к элементу управления элементами? - PullRequest
0 голосов
/ 26 сентября 2019

У меня есть этот ItemsControl:

<ItemsControl Grid.Row="1" ItemsSource="{Binding Board}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True"/>
        </ItemsPanelTemplate>
    </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate DataType="local:Square">
            <Rectangle Stroke="Blue" StrokeThickness="0.5" Width="{Binding Width}" Height="{Binding Height}"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

, и он просто рисует квадраты на экране.Я хочу событие, чтобы при нажатии на один из квадратов, вызывающих это событие, мне также нужно было получить объект, по которому я щелкнул (тип данных шаблона - класс Square, а вся сетка привязана к наблюдаемой коллекции).называется Board), как я могу это сделать?

1 Ответ

1 голос
/ 26 сентября 2019

Поместите прямоугольник в шаблон кнопки и обработайте событие нажатия кнопки.Не забудьте установить для прямоугольника Fill значение Transparent, иначе щелчки мыши в области заполнения кнопки не будут обнаружены.

<Button Click="Rectangle_Click">
    <Button.Template>
        <ControlTemplate TargetType="Button">
            <Rectangle 
                Fill="Transparent" 
                Stroke="Blue" 
                StrokeThickness="0.5" 
                Width="{Binding Width}" 
                Height="{Binding Height}"
                />
        </ControlTemplate>
    </Button.Template>
</Button>
private void Rectangle_Click(object sender, RoutedEventArgs e)
{
    var button = sender as Button;
    var square = button.DataContext as Square;

    //  Do whatever
}

Было бы предпочтительно дать Square свойство команды и связать Button.Command с этим:

public class Square
{
    //  stuff

    public ICommand SelectCommand { get; } // Initialize in constructor

    //  stuff
}
<Button Command="{Binding SelectCommand}">
<!-- ...as before... -->

Но тогда вам нужнореализовать ICommand и т. д. Событие Click работает достаточно хорошо.

Вы также можете обрабатывать MouseLeftButtonDown на самом прямоугольнике.Вам все равно придется установить его Fill на Transparent.Я предпочитаю это решение, потому что поведение Click более сложное, чем MouseLeftButtonDown: например, когда вы нажимаете кнопку мыши и перетаскиваете ее, прежде чем отпустить кнопку мыши, Click не поднимается.Пользователи привыкли к такому поведению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...