Wpf Caliburn Micro:绑定假标题矩形的点击事件

Wpf Caliburn Micro: binding click event of faked captioned Rectangle

我使用 VS2013、Wpf 4.5 和 Caliburn Micro。 我想使用 Rectangle 并将 TextBlock 放入其中。我在 Whosebug 中找到了一个解决方案:将矩形和文本块放在一个网格中。有效。

然后我想在用户点击矩形时捕获点击事件。所以我在标签中添加 x:Name="ClickMe" 属性以将点击事件绑定到视图模型。它有效,但前提是鼠标指向矩形的 non-text 区域。 只要鼠标指针在TextBlock区域,点击事件就会被忽略!

我的第一次尝试:使用 x:Name="ClickText1" 将 TextBlock 绑定到事件处理程序 ClickText1()。它不起作用。 TextBlock 似乎没有 Click 事件。

我的第二次尝试:我尝试将 TextBlock 放入 StackPanel,使用 x:Name="ClickStack" 绑定 StackPanel,事件处理程序 ClickStack() 将调用 ClickMe()。它不起作用,因为一旦应用程序启动就会调用 ClickStack() 并且 在显示视图之前 。所以我的尝试失败了!

我想要的:无论 text-area 还是 non-text 区域,整个矩形区域都应该是可点击的(并引发点击事件)并且点击事件可以绑定到视图模型中的一个事件处理程序.所有都应该在 Caliburn 微模式下工作,没有 code-behind.

我在下面附上我的示例代码。请随时修改它并告诉我如何解决它。您可能还会建议我使用其他简单的方法在不使用网格的情况下将文本放在矩形上。但由于我的项目需要,请不要建议我使用 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="[点击事件] = [动作 ClickMe()]"

还是不行。

编辑(最终):

我使用 MouseLeftButtonDown 而不是 Tapped,现在可以使用了。

Tapped 是您必须定位的事件,因为该控件的 Click 不存在,约定将不起作用。 cm:Message.Attach="[Event Tapped] = [Action ClickMe()]" 是您唯一的选择。您可以强制约定,但它是该控件的自定义内容。