我编写了一个自定义WPF UserControl。它是一个名为Grid
Base
的正方形。对于该网格,我添加了一个椭圆和两个标签(volume
和location
),这些标签填充了从对象属性中提取的文本,该对象在控件实例化时作为参数提供。
这是XAML:
<UserControl x:Class="EasyHyb.SampleWellControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DesignHeight="100" d:DesignWidth="100">
<Grid x:Name="Base">
</Grid>
</UserControl>
代码隐藏中的构造函数/事件函数:
public SampleWellControl(int size, SourceSample sample)
{
InitializeComponent();
this.sample = sample;
this.Width = this.Height = size;
this.selected = SelectionStatus.Unselected;
double spacing = size / 4;
volume = new Label();
location = new Label();
volume.Content = String.Format("{0:0.00}", sample.volume);
location.Content = sample.well.well;
volume.HorizontalAlignment = location.HorizontalAlignment = System.Windows.HorizontalAlignment.Center;
volume.FontFamily = location.FontFamily = new System.Windows.Media.FontFamily("Meiryo UI");
volume.FontWeight = location.FontWeight = FontWeights.Bold;
volume.Background = location.Background = Base.Background = this.Background = Brushes.Transparent;
volume.Margin = new Thickness(0, spacing, 0, 0);
location.Margin = new Thickness(0, spacing * 2, 0, 0);
well = new Ellipse();
well.Width = well.Height = this.Width;
well.StrokeThickness = 3;
Base.Children.Add(well);
Base.Children.Add(volume);
Base.Children.Add(location);
this.MouseEnter += SampleWellControl_MouseEnter;
this.MouseLeave += SampleWellControl_MouseLeave;
this.MouseUp += SampleWellControl_MouseUp;
this.Cursor = Cursors.Hand;
UpdateFillAndStroke();
}
void SampleWellControl_MouseLeave(object sender, MouseEventArgs e)
{
RevertWell();
}
void SampleWellControl_MouseEnter(object sender, MouseEventArgs e)
{
HighlightWell();
}
public void HighlightWell()
{
if (this.selected == SelectionStatus.Pooled)
{
return;
}
if (this.selected == SelectionStatus.Unselected)
{
this.well.Stroke = this.strokes[SelectionStatus.Selected];
}
else
{
this.well.Stroke = this.strokes[SelectionStatus.Unselected];
}
}
public void RevertWell()
{
if (this.selected == SelectionStatus.Pooled)
{
return;
}
if (this.selected == SelectionStatus.Unselected)
{
this.well.Stroke = this.strokes[SelectionStatus.Unselected];
}
else
{
this.well.Stroke = this.strokes[SelectionStatus.Selected];
}
}
基本上,当鼠标进入控制器时,椭圆的行程应该改变,除非井已经过操作以给它一个&#34; Pooled&#34;状态。
当鼠标进入控件时,它会完全按照我的预期响应:MouseEnter
事件处理程序触发。但是,当用户将鼠标移动到控件内的其中一个标签上时,MouseLeave
事件将触发。所以尽管标签表面上是控件的一部分,但下面的图片显示了我正在谈论的内容。 Print Screen删除了光标,但是我用蓝点表示光标所在的位置:
正确回应:
现在似乎认为鼠标已离开控件:
我已尝试将MouseEnter和MouseLeave事件处理程序添加到标签中,但它们不会触发。当标签被鼠标悬停时,光标也会从指针变为指针。我已经尝试将MouseEnter和MouseLeave事件处理程序添加到控件中,然后在另一个类中实例化。我为网格,控件和标签添加了透明背景,但这也没有任何区别。
我还检查了我的MouseLeave事件处理程序,看看鼠标是否在控件上,并且控件似乎没有检测到光标在控件本身上方:
if(!this.IsMouseOver)
{
RevertWell();
}
//also tried IsMouseDirectlyOver
我希望MouseLeave
仅在光标退出控件的方形边界时触发。如何在保留标签的同时实现这一目标?
答案 0 :(得分:0)
使用
的组合IsHitTestVisible="False"
添加到Base的所有对象:
volume = new Label();
volume.IsHitTestVisible="False";
然后你的容器有事件,给出背景
<Grid x:Name="Base" Background="White">
(我也想评论,但声誉很愚蠢)
答案 1 :(得分:0)
UserControl
班,EmptyWellControl
,其中有一个Label
。标签中的文本位置是使用Label
的{{1}}属性计算的,这导致了一个无意义的值,使标签垂直延伸到窗口的尺寸之外。标签没有背景,但仍然干扰了其交叉路径的控件。由于空的和样品孔都布置在同一网格上,因此每个Height
都会受到这些标签的影响。