我有以下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本身内部使用鼠标?
答案 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。