Как я могу «подделать» событие «Щелчок мышью» на холсте в Silverlight? - PullRequest
0 голосов
/ 12 ноября 2010

По сути, я создал класс «Adorner» для Silverlight, который позволяет пользователю перемещать, масштабировать и вращать любой объект, который он украшает.Это работает так, что Adorner отслеживает любые события мыши на своем дочернем элементе и отвечает соответствующим образом.

Это прекрасно работает для простых элементов, таких как эллипсы и прямоугольники.Но у меня есть пользовательский элемент, который содержит изображение и метку внутри Canvas.

Моя проблема заключается в следующем.Я хочу, чтобы пользователь мог перемещать метку независимо от изображения, но сохранял это движение только как смещение (поэтому я не просто позволяю им отдельно добавлять изображение и метку).Это означает, что метка должна будет использовать свойства Canvas.Left и Canvas.Top.Однако всякий раз, когда я добавляю их, ярлык становится не щелкающим ... т.е. элемент больше не распознает щелчок при нажатии ярлыка, однако он все равно реагирует на нажатие пользователем изображения.

Я предполагаю, что этоимеет какое-то отношение к тому, что элемент Canvas не имеет автоматического управления макетом.

Альтернативой является использование Grid и установка Margin.Top и Margin.Left, которые работают, но не допускают отрицательного поля- поэтому ярлык никогда не сможет появиться выше и слева от изображения, что не подходит для наших нужд.(Это не совсем верно, оно МОЖЕТ появиться сверху и слева, но перестает реагировать на события мыши, когда у него отрицательное поле)

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

Если у кого-то есть какие-либо идеи, они будуточень признателен !!

Редактировать: Вот XAML для моего пользовательского элемента.Элемент НЕ запускает событие MouseLeftButtonDown при щелчке TextBlock, но ДЕЙСТВИТЕЛЬНО при щелчке по изображению.

<UserControl x:Class="SitePlanViewer.Components.Visual.BoreholeElement"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Border x:Name="Border" BorderBrush="Transparent" BorderThickness="2" Margin="-5">
        <Canvas x:Name="MainCanvas" Margin="5" MinWidth="12" MinHeight="12">
            <Image x:Name="BoreholeImage" Source="/Images/BoreholeSymbol.png" VerticalAlignment="Center" Width="12" Height="12" />
            <TextBlock x:Name="Label" FontSize="8" Canvas.Left="40" Canvas.Top="20"  />
        </Canvas>
    </Border>
</UserControl>

Ответы [ 2 ]

2 голосов
/ 12 ноября 2010

Вы не можете автоматизировать события мыши для элементов, так как это может открыть уязвимость системы безопасности (помните, что вы можете вызывать определенные операции только при реальных щелчках мыши, например при открытии файлов, поэтому они не позволяют имитировать щелчки).

Ваш пример работает только для изображения , потому что холст физически находится под изображением.

События мыши передаются на холст, только если экстент холста находится непосредственно под мышью (например, если вы сделаете холст еще меньше, щелчки изображения также прекратят распространяться на холст).

Если вы увеличите размер холста (например, включите все возможные позиции метки), он получит события, но если у вас есть несколько элементов BoreholeElements на одной странице, у вас будут перекрывающиеся объекты холста (что, очевидно, плохо).

Возможно, вам придется переработать свой подход к проблеме.Возможно, один большой холст со всеми дочерними объектами?

0 голосов
/ 12 ноября 2010

Не могли бы вы создать соответствующий объект EventArgs, а затем вызвать метод OnClick, напрямую передав EventArgs

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