鼠标左键在需要时未触发
Mouse left button up not fired when wanted
任务:
我有一个简单的任务要执行:在椭圆内绕椭圆中心移动一根针。就是要变成角度计indicator/control。
状态:
我想根据鼠标的位置移动这根针,当左键在椭圆内按下时。
没关系。
我想在松开鼠标左键时停止移动。
没关系。
我的问题:
但问题是,如果我用鼠标左键按下退出椭圆区域(即不小心,当移动针时),那么它是"hold"。
如果您用鼠标左键 UP 返回椭圆,指针将像被单击一样移动。
所以我需要的是当我的鼠标离开椭圆时禁用 "drag" ,无论是否单击鼠标左键。
此时,如果指针为"locked",则需要走出椭圆,点击鼠标左键,进入椭圆区域,按住鼠标左键不放。如果您现在松开鼠标左键,它将返回到其 normal/wanted 行为。
这是我的 XAML "code":
<Window x:Class="test_gauge.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp">
<Ellipse Name="ellipse1" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Stroke="Black" VerticalAlignment="Top" Width="100" Canvas.Left="0" Canvas.Top="0" Margin="280,180,0,0" MouseMove="onEllipseMouseMove" MouseLeftButtonDown="onEllipseMouseLeftPressed" MouseLeftButtonUp="onEllipseMouseLeftReleased" MouseLeave="onEllipseMouseLeave"/>
<Canvas Margin="257,145,10,10" MouseLeftButtonUp="Canvas_MouseLeftButtonUp_1">
<Thumb Name="myThumb" Canvas.Left="73" Canvas.Top="85" RenderTransformOrigin="0,0">
<Thumb.RenderTransform>
<RotateTransform/>
</Thumb.RenderTransform>
<Thumb.Template>
<ControlTemplate>
<Line Name="needle_line" X1="0" Y1="0" X2="50" Y2="0" StrokeThickness="2" Stroke="Black" MouseLeave="needle_line_MouseLeave"/>
</ControlTemplate>
</Thumb.Template>
</Thumb>
<TextBox Name="txtbxAngle" Height="23" Canvas.Left="168" TextWrapping="Wrap" Text="TextBox" Canvas.Top="25" Width="72"/>
</Canvas>
</Grid>
</Window>
然后C#"code":
public partial class MainWindow : Window
{
/* Angle control stuff */
public bool bNeedlePressed = false;
public double refreshedAngle = 0;
public MainWindow()
{
InitializeComponent();
}
private void onEllipseMouseMove(object sender, MouseEventArgs e)
{
if (bNeedlePressed)
{
// This will get the mouse cursor relative to the upper left corner of your ellipse.
// Note that nothing will happen until you are actually inside of your ellipse.
Point curPoint = e.GetPosition(ellipse1);
// Assuming that your ellipse is actually a circle.
Point center = new Point(ellipse1.Width / 2, ellipse1.Height / 2);
// A bit of math to relate your mouse to the center...
Point relPoint = new Point(curPoint.X - center.X, curPoint.Y - center.Y);
/* Process new angle */
refreshedAngle = Math.Atan2(relPoint.Y, relPoint.X) * 180 / Math.PI;
txtbxAngle.Text = ((int)(refreshedAngle)).ToString();
/* Apply new angle */
var transform = myThumb.RenderTransform as RotateTransform;
transform.Angle = refreshedAngle;
}
}
private void onEllipseMouseLeftPressed(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = true;
}
private void Canvas_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
private void onEllipseMouseLeftReleased(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
private void onEllipseMouseLeave(object sender, MouseEventArgs e)
{
//bNeedlePressed = false;
}
private void needle_line_MouseLeave(object sender, MouseEventArgs e)
{
//bNeedlePressed = false;
}
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
}
如您所见,它使用了不同的事件,但 none 达到了目的。
好吧,我相信至少有一个,但我不知道是哪个。
如果您有什么想法,请随时回答:)
您可以管理鼠标离开事件
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
bNeedlePressed = false;
}
在 XAML
中声明
<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp" MouseLeave="Grid_MouseLeave" MouseEnter="Grid_MouseEnter">
鼠标进入
private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
bNeedlePressed = e.LeftButton == MouseButtonState.Pressed;
}
任务: 我有一个简单的任务要执行:在椭圆内绕椭圆中心移动一根针。就是要变成角度计indicator/control。
状态:
我想根据鼠标的位置移动这根针,当左键在椭圆内按下时。
没关系。
我想在松开鼠标左键时停止移动。
没关系。
我的问题:
但问题是,如果我用鼠标左键按下退出椭圆区域(即不小心,当移动针时),那么它是"hold"。 如果您用鼠标左键 UP 返回椭圆,指针将像被单击一样移动。 所以我需要的是当我的鼠标离开椭圆时禁用 "drag" ,无论是否单击鼠标左键。 此时,如果指针为"locked",则需要走出椭圆,点击鼠标左键,进入椭圆区域,按住鼠标左键不放。如果您现在松开鼠标左键,它将返回到其 normal/wanted 行为。
这是我的 XAML "code":
<Window x:Class="test_gauge.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp">
<Ellipse Name="ellipse1" Fill="#FFF4F4F5" HorizontalAlignment="Left" Height="100" Stroke="Black" VerticalAlignment="Top" Width="100" Canvas.Left="0" Canvas.Top="0" Margin="280,180,0,0" MouseMove="onEllipseMouseMove" MouseLeftButtonDown="onEllipseMouseLeftPressed" MouseLeftButtonUp="onEllipseMouseLeftReleased" MouseLeave="onEllipseMouseLeave"/>
<Canvas Margin="257,145,10,10" MouseLeftButtonUp="Canvas_MouseLeftButtonUp_1">
<Thumb Name="myThumb" Canvas.Left="73" Canvas.Top="85" RenderTransformOrigin="0,0">
<Thumb.RenderTransform>
<RotateTransform/>
</Thumb.RenderTransform>
<Thumb.Template>
<ControlTemplate>
<Line Name="needle_line" X1="0" Y1="0" X2="50" Y2="0" StrokeThickness="2" Stroke="Black" MouseLeave="needle_line_MouseLeave"/>
</ControlTemplate>
</Thumb.Template>
</Thumb>
<TextBox Name="txtbxAngle" Height="23" Canvas.Left="168" TextWrapping="Wrap" Text="TextBox" Canvas.Top="25" Width="72"/>
</Canvas>
</Grid>
</Window>
然后C#"code":
public partial class MainWindow : Window
{
/* Angle control stuff */
public bool bNeedlePressed = false;
public double refreshedAngle = 0;
public MainWindow()
{
InitializeComponent();
}
private void onEllipseMouseMove(object sender, MouseEventArgs e)
{
if (bNeedlePressed)
{
// This will get the mouse cursor relative to the upper left corner of your ellipse.
// Note that nothing will happen until you are actually inside of your ellipse.
Point curPoint = e.GetPosition(ellipse1);
// Assuming that your ellipse is actually a circle.
Point center = new Point(ellipse1.Width / 2, ellipse1.Height / 2);
// A bit of math to relate your mouse to the center...
Point relPoint = new Point(curPoint.X - center.X, curPoint.Y - center.Y);
/* Process new angle */
refreshedAngle = Math.Atan2(relPoint.Y, relPoint.X) * 180 / Math.PI;
txtbxAngle.Text = ((int)(refreshedAngle)).ToString();
/* Apply new angle */
var transform = myThumb.RenderTransform as RotateTransform;
transform.Angle = refreshedAngle;
}
}
private void onEllipseMouseLeftPressed(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = true;
}
private void Canvas_MouseLeftButtonUp_1(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
private void onEllipseMouseLeftReleased(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
private void onEllipseMouseLeave(object sender, MouseEventArgs e)
{
//bNeedlePressed = false;
}
private void needle_line_MouseLeave(object sender, MouseEventArgs e)
{
//bNeedlePressed = false;
}
private void Grid_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
bNeedlePressed = false;
}
}
如您所见,它使用了不同的事件,但 none 达到了目的。 好吧,我相信至少有一个,但我不知道是哪个。
如果您有什么想法,请随时回答:)
您可以管理鼠标离开事件
private void Grid_MouseLeave(object sender, MouseEventArgs e)
{
bNeedlePressed = false;
}
在 XAML
中声明<Grid MouseLeftButtonUp="Grid_MouseLeftButtonUp" MouseLeave="Grid_MouseLeave" MouseEnter="Grid_MouseEnter">
鼠标进入
private void Grid_MouseEnter(object sender, MouseEventArgs e)
{
bNeedlePressed = e.LeftButton == MouseButtonState.Pressed;
}