Я использую 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, и теперь он работает.