2015-06-29 2 views
1

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

ответ

1

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

+0

который управление вы имеете в виду? ? – MagB

+0

Я также пробовал . Но это все еще не работает. И да, я уже установил xmlns: cm = "http://www.caliburnproject.org" в UserControl (см. Отредактированный пример кода выше) – MagB

+0

ОК.Я нашел решение. Я использую «MouseLeftButtonDown» вместо «Tapped». Спасибо. – MagB