Reputation: 3885
I'm trying to move the Button inside my application, It's working fine but the ButtonClick event is not firing now.
Code :
XAML
<Button Content="Button" Height="23" HorizontalAlignment="Left"
Margin="190,108,0,0" Name="button1" VerticalAlignment="Top"
Width="75" MouseLeftButtonUp="button1_MouseLeftButtonUp"
MouseMove="button1_MouseMove" MouseUp="button1_MouseUp" Click="button1_Click"/>
C#
public MainWindow()
{
InitializeComponent();
button1.PreviewMouseUp += new MouseButtonEventHandler(button1_MouseUp);
button1.PreviewMouseLeftButtonDown += new MouseButtonEventHandler
(button1_MouseLeftButtonUp);
button1.PreviewMouseMove += new MouseEventHandler(button1_MouseMove);
}
double m_MouseX;
double m_MouseY;
public MainWindow()
{
InitializeComponent();
button1.PreviewMouseUp += new MouseButtonEventHandler(button1_MouseUp);
button1.PreviewMouseLeftButtonDown += new MouseButtonEventHandler(button1_MouseLeftButtonUp);
button1.PreviewMouseMove += new MouseEventHandler(button1_MouseMove);
}
private void button1_MouseLeftButtonUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
// Get the Position of Window so that it will set margin from this window
m_MouseX = e.GetPosition(this).X;
m_MouseY = e.GetPosition(this).Y;
}
private void button1_MouseMove(object sender, System.Windows.Input.MouseEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
// Capture the mouse for border
e.MouseDevice.Capture(button1);
System.Windows.Thickness _margin = new System.Windows.Thickness();
int _tempX = Convert.ToInt32(e.GetPosition(this).X);
int _tempY = Convert.ToInt32(e.GetPosition(this).Y);
_margin = mainGrd.Margin;
// when While moving _tempX get greater than m_MouseX relative to usercontrol
if (m_MouseX > _tempX)
{
// add the difference of both to Left
_margin.Left += (_tempX - m_MouseX);
// subtract the difference of both to Left
_margin.Right -= (_tempX - m_MouseX);
}
else
{
_margin.Left -= (m_MouseX - _tempX);
_margin.Right -= (_tempX - m_MouseX);
}
if (m_MouseY > _tempY)
{
_margin.Top += (_tempY - m_MouseY);
_margin.Bottom -= (_tempY - m_MouseY);
}
else
{
_margin.Top -= (m_MouseY - _tempY);
_margin.Bottom -= (_tempY - m_MouseY);
}
mainGrd.Margin = _margin;
m_MouseX = _tempX;
m_MouseY = _tempY;
}
}
private void button1_MouseUp(object sender, System.Windows.Input.MouseButtonEventArgs e)
{
e.MouseDevice.Capture(null);
}
private void button1_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show("HI");
}
button1_Click never fires, any suggestions. Is I'm doing something wrong or there is a better way to do it?
Upvotes: 0
Views: 222
Reputation: 397
This prevents your button1_Click
from firing:
e.MouseDevice.Capture(null);
I assume that you want the messagebox to show only when you click the button without dragging it.
I would remove the MouseUp event and instead use:
XAML
PreviewMouseDown="Button1_OnPreviewMouseDown"
C#
double m_MouseX;
double m_MouseY;
double m_ClickedX;
double m_ClickedY;
[...]
private void Button1_OnPreviewMouseDown(object sender, MouseButtonEventArgs e)
{
m_ClickedX = m_MouseX;
m_ClickedY = m_MouseY;
}
private void button1_Click(object sender, RoutedEventArgs e)
{
if (m_ClickedX == m_MouseX && m_ClickedY == m_MouseY)
{
MessageBox.Show("HI");
}
}
The if statement checks if you have moved the button or not and only shows the MessageBox if the button has not been moved.
Upvotes: 2