PreviewMouseLeftButtonUp未按预期触发

时间:2016-05-09 21:47:36

标签: c# wpf events

我有以下XAML:

<UserControl x:Class="WPFSandpit.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Height="350" Width="525">
<Border BorderThickness="1" BorderBrush="Blue" Width="100" Height="35" PreviewMouseLeftButtonUp="OnPreviewMouseLeftButtonUp">
    <Grid >
        <Grid.Style>
            <Style>
                <Style.Triggers>
                    <Trigger Property="Border.IsMouseOver" Value="True">
                        <Setter Property="Border.Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Grid.Style>
        <TextBlock Text="MyText"  Margin="2" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="14"
                       FontWeight="SemiBold"/>
    </Grid>
</Border>

事件处理程序的代码只显示一个消息框:

    public partial class MainWindow
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        MessageBox.Show("Selected");
    }
}

我很难理解为什么只在TextBlock中触发事件而不是在Border本身内部使用鼠标?

2 个答案:

答案 0 :(得分:1)

我认为,当你越过边界时,你希望文本框变成红色,而当你在边界内时(如果你真的意味着触发OnPreviewMouseLeftButtonUp,你必须更清楚地提出你的问题,对我来说似乎用您的代码触发就好了)。基于该假设,您只需将样式置于错误的范围内。将样式应用于xaml中的边界节点时,其行为与预期一致,如下面的代码片段所示。请注意,我增加了边框宽度以更轻松地触发事件以及颜色更改。

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApplication1"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Border BorderThickness="10" BorderBrush="Blue" Width="100" Height="35" PreviewMouseLeftButtonUp="OnPreviewMouseLeftButtonUp">
        <Border.Style>
            <Style>
                <Style.Triggers>
                    <Trigger Property="Border.IsMouseOver" Value="True">
                        <Setter Property="Border.Background" Value="Red" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Border.Style>
        <Grid >
                <TextBlock Text="MyText"  Margin="2" VerticalAlignment="Center" HorizontalAlignment="Center" FontSize="14"
                       FontWeight="SemiBold"/>
            </Grid>
        </Border>
</Window>

和c#代码:

namespace WpfApplication1
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void OnPreviewMouseLeftButtonUp(object sender, MouseButtonEventArgs e)
        {
            MessageBox.Show("Selected" + sender.ToString());
        }
    }
}

答案 1 :(得分:0)

乍一看,看起来文本框正在处理事件并且根本没有冒泡事件,因为TextBox将处理所有鼠标事件,例如预览,捕获,拖动等。如果你在XAML中获得没有TextBox的事件那么这可能就是发生了什么。

不确定最终目标是基于您的代码,但是您计划在border事件处理程序中为该事件做的任何事情都需要在TextBox事件处理程序中处理。或者,您可以在TextBox中处理事件(创建事件处理程序),调用基本处理程序,然后将Handled设置为false。