Я использую VS2013, Wpf 4.5 и Caliburn Micro. Я хочу использовать прямоугольник и помещать в него TextBlock. Я нашел решение здесь в StackOverflow: поместил прямоугольник и текстовый блок в сетку. Оно работает.Wpf Caliburn Micro: привязка события щелчка поддельных заголовков Прямоугольник
Затем я хочу поймать событие click, если пользователь нажмет на прямоугольник. Поэтому я добавляю атрибут x: Name = "ClickMe" в тег для привязки события click для просмотра модели. Он работает, но только если мышь указывает на нетекстовую область прямоугольника. Как только указатель мыши находится в области TextBlock, событие click игнорируется!
Моя первая попытка: привязать TextBlock с помощью x: Name = "ClickText1" к обработчику событий ClickText1(). Это не работает. Кажется, у TextBlock нет события Click.
Моя вторая попытка: я попытался поместить TextBlock в StackPanel, связать StackPanel с помощью x: Name = "ClickStack", а обработчик событий ClickStack() вызовет ClickMe(). Он не работает, так как вызывается ClickStack(), как только приложение запускается, и перед его просмотром отображается. Так что моя попытка провалилась!
Что я хочу: вся область прямоугольника должна быть конфиденциальной (и повышать клик) независимо от текстовой области или нетекстовой области, а событие click может быть привязано к ОДНОМУ обработчику событий в модели вида. Все должны работать в микросхеме калибр и не содержать кода.
Прилагаю свой пример кода ниже. Пожалуйста, не стесняйтесь изменять его и показывать мне, как его решить. Вы также можете предложить мне другой простой способ поместить текст на прямоугольник без использования сетки. Но , пожалуйста, не предлагайте мне использовать управление кнопками из-за требований моего проекта. Заранее спасибо.
The View:
<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();
}
}
}
EDIT:
добавлены в XAML:
Xmlns: см = "HTTP: // www.caliburnproject.org "
см: Сообщение.Attach = "[Событие нажато] = [Действие ClickMe()]"
Он по-прежнему не работает, как я хочу.
EDIT (конечный):
Я использую MouseLeftButtonDown вместо резьбового и он работает в настоящее время.
который управление вы имеете в виду?? –
MagB
Я также пробовал. Но это все еще не работает. И да, я уже установил xmlns: cm = "http://www.caliburnproject.org" в UserControl (см. Отредактированный пример кода выше) –
MagB
ОК.Я нашел решение. Я использую «MouseLeftButtonDown» вместо «Tapped». Спасибо. – MagB