WPF Interaction.Triggers MouseDown EventTrigger не работает с элементом Canvas

Я пытаюсь создать приложение MVVM WPF, которое позволяет мне рисовать прямоугольник в окне. Прямо сейчас я создал элемент холста, который покрывает весь экран. Следуя другим вопросам и руководствам, похоже, что единственный способ использовать привязки команд к событиям мыши (таким как MouseDown, MouseUp и т. д.) — это использовать сборку System.Windows.Interactivity и добавить EventTriggers для событий мыши. Однако это, похоже, не работает с элементом холста. Щелчок, щелчок/удержание, щелчок/перетаскивание, щелчок правой кнопкой мыши, ни один из них не запускает метод Execute моей команды.

Каковы поддерживаемые события для элемента холста? Почему MouseDown или PreviewMouseDown не работают?

XAML для окна:

<Window x:Class="RutheniumReader.SnippingWindow.SnippingShade"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
    xmlns:snippingWindow="clr-namespace:MyApp.SnippingWindow"
    mc:Ignorable="d"
    Title="Snipping Window"
    WindowState="Maximized"
    Background="Black"
    >
    <Window.DataContext>
        <snippingWindow:SnippingWindowViewModel />
    </Window.DataContext>
    <Canvas x:Name="Canvas">
        <i:Interaction.Triggers>
            <i:EventTrigger EventName="MouseDown">
                <i:InvokeCommandAction Command="{Binding Path=MouseDownCommand}" />
            </i:EventTrigger>
        </i:Interaction.Triggers>
    </Canvas>
</Window>

В целях тестирования я безуспешно пробовал следующие события:

  • Щелчок - работает, если я применяю его к элементу Button внутри холста
  • МышьВниз
  • PreviewMouseDown — работает с элементом Button
  • МышьСлеваКнопкаВниз
  • Предварительный просмотрLeftMouseButtonDown

person Ben Russell    schedule 24.07.2016    source источник


Ответы (1)


События мыши не работают, потому что фон холста не установлен. Если элемент управления (в данном случае ваш Canvas) не имеет установленного цвета фона, цвет фона по умолчанию будет нулевым, и это делает элемент управления непроверяемым на попадание.

Фон может быть установлен либо явно, либо через стили, и пока он имеет значение, отличное от null (даже «Прозрачный»), он должен захватывать события мыши.

person snickro    schedule 24.07.2016
comment
Да, это работает! Почему-то я не думал, что это применимо, так как я установил фон в окне. - person Ben Russell; 25.07.2016
comment
Это кажется довольно неинтуитивной операцией. Хороший ответ, хотя - person Dan; 20.10.2017
comment
Transparent у меня не сработало (используя элемент Rectangle), поэтому я установил Fill на #01000000. - person Rob VS; 03.11.2020