Wpf Caliburn Micro: событие щелчка привязки поддельного прямоугольника с заголовком

Я использую VS2013, Wpf 4.5 и Caliburn Micro. Я хочу использовать Rectangle и поместить в него TextBlock. Я нашел решение здесь, в StackOverflow: поместите прямоугольник и текстовый блок в сетку. Оно работает.

Затем я хочу поймать событие щелчка, если пользователь щелкнет прямоугольник. Поэтому я добавляю атрибут x: Name = "ClickMe" в тег, чтобы привязать событие клика к просмотру модели. Это работает, но только если указатель мыши указывает на нетекстовую область прямоугольника. Как только указатель мыши находится в области TextBlock, событие нажатия игнорируется!

Моя первая попытка: привязать TextBlock с помощью x: Name = "ClickText1" к обработчику событий ClickText1 (). Не работает. Кажется, у TextBlock нет события Click.

Моя вторая попытка: я попытался поместить TextBlock в StackPanel, связать StackPanel с помощью x: Name = "ClickStack", и обработчик событий ClickStack () вызовет ClickMe (). Это не работает, поскольку ClickStack () вызывается при запуске приложения и перед отображением его просмотра. Так что моя попытка не удалась!

Что я хочу: вся область прямоугольника должна быть кликабельной (и вызывать событие щелчка) независимо от текстовой области или нетекстовой области, а событие щелчка может быть привязано к ОДНОМ обработчику событий в модели представления. Все должно работать в микро-шаблоне калибровки и без кода программной части.

Прилагаю свой образец кода ниже. Пожалуйста, не стесняйтесь изменять его и показывать мне, как его решить. Вы также можете предложить мне другой простой способ разместить текст на прямоугольнике без использования сетки. Но пожалуйста, не предлагайте мне использовать элемент управления Button из-за требований моего проекта. Заранее спасибо.

Вид:

<UserControl x:Class="CMWpfShapeWithCaption.Views.ShellView"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:cm="http://www.caliburnproject.org"                    
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
         d:DesignHeight="300"
         d:DesignWidth="300"
         mc:Ignorable="d">
    <Grid Width="300"
          Height="300"
          ShowGridLines="False">
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="20*" />
            <ColumnDefinition Width="20*" />
            <ColumnDefinition Width="20*" />
        </Grid.ColumnDefinitions>
        <Grid.RowDefinitions>
            <RowDefinition Height="20*" />
            <RowDefinition Height="20*" />
            <RowDefinition Height="20*" />
        </Grid.RowDefinitions>
        <Rectangle x:Name="ClickMe"
                   Grid.Row="1"
                   Grid.Column="1"
                   Fill="Aqua" />
        <StackPanel Grid.Row="1"
                    Grid.Column="1"
                    HorizontalAlignment="Center"
                    VerticalAlignment="Center">
             <TextBlock x:Name="ClickText1"
                        HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        cm:Message.Attach="[Event MouseLeftButtonDown] = [Action ClickMe()]"
                        Text="{Binding Path=Text1}"
                        TextWrapping="Wrap" />
             <TextBlock HorizontalAlignment="Center"
                        VerticalAlignment="Center"
                        cm:Message.Attach="[Event MouseLeftButtonDown] = [Action ClickMe()]"
                        Text="{Binding Path=Text2}"
                        TextWrapping="Wrap" />
         </StackPanel>
     </Grid>
</UserControl>

Модель представления:

using System;
using System.Windows;
using Caliburn.Micro;

namespace CMWpfShapeWithCaption.ViewModels
{
    public class ShellViewModel : PropertyChangedBase
    {
        public ShellViewModel()
        {
            Text1 = "Text1";
            Text2 = "Text2";
        }
        public String Text1 { get; set; }
        public String Text2 { get; set; }

        // Problem: this will be called only if Mouse points non-text area of grid
        // Target: This should be called regardless non-text or text-area,
        // as long as the mouse is clicked within rectangle area.
        public void ClickMe()
        {
            MessageBox.Show("Panel is clicked");
        }

        // This trick doesn't work at all.
        // It seems TextBlock has no click event?
        public void ClickText1()
        {
            ClickMe();
        }
    }
}

РЕДАКТИРОВАТЬ:

добавлено в xaml:

xmlns: cm = "http://www.caliburnproject.org"

cm: Message.Attach = "[Event Tapped] = [Action ClickMe ()]"

Это все еще не работает так, как я хочу.

РЕДАКТИРОВАТЬ (окончательный):

Я использую MouseLeftButtonDown вместо Tapped, и теперь он работает.


person MagB    schedule 29.06.2015    source источник


Ответы (1)


Tapped - это событие, на которое вы должны нацелить, поскольку Click не существует для этого элемента управления, и соглашение не будет работать. cm:Message.Attach="[Event Tapped] = [Action ClickMe()]" - ваш единственный вариант. Вы можете принудительно установить соглашение, но оно будет обычным для этого элемента управления.

person mvermef    schedule 30.06.2015
comment
какой контроль вы имеете в виду? ‹Прямоугольник в см: Message.Attach = [Событие нажато] = [Действие ClickMe ()]›? - person MagB; 01.07.2015
comment
Я также пробовал ‹TextBlock cm: Message.Attach = [Event Tapped] = [Action ClickMe ()]›. Но все равно не работает. И да, я уже поместил xmlns: cm = caliburnproject.org в UserControl (см. Отредактированный образец кода выше) - person MagB; 01.07.2015
comment
В ПОРЯДКЕ. Я нашел решение. Я использую MouseLeftButtonDown вместо Tapped. Спасибо. - person MagB; 01.07.2015