我有WPF应用程序,我在窗口中的画布上添加了一些鼠标事件,以启用拖放功能。当在调试模式下从visualstudio运行应用程序时,它可以很好地工作,但当我在没有调试的情况下运行该应用程序时它就不工作了。有人能帮忙吗!
XAML
<Canvas Name="canvas"
Width="{Binding DialogWidth, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
Height="{Binding DialogHight, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
HorizontalAlignment="Center"
VerticalAlignment="Center"
Background="Transparent"
PreviewMouseDown="Grid_MouseDown"
PreviewMouseMove="Grid_MouseMove"
PreviewMouseUp="Grid_MouseUp">
<Canvas.RenderTransform>
<TranslateTransform x:Name="tt" />
</Canvas.RenderTransform>
</Canvas>
背后的代码
private Point _mStart;
private Vector _mStartOffset;
private void Grid_MouseDown(object sender, MouseButtonEventArgs e)
{
var window = Application.Current.MainWindow;
var canvas = (Canvas) sender;
var tt = canvas.RenderTransform as TranslateTransform ;
_mStart = e.GetPosition(window);
if (tt != null) _mStartOffset = new Vector(tt.X, tt.Y);
canvas.CaptureMouse();
}
private void Grid_MouseMove(object sender, MouseEventArgs e)
{
var canvas = (Canvas)sender;
var tt = canvas.RenderTransform as TranslateTransform;
if (tt == null) return;
var window = Application.Current.MainWindow;
if (!canvas.IsMouseCaptured) return;
var offset = Point.Subtract(e.GetPosition(window), _mStart);
// if (-_mStartOffset.X + canvas.ActualWidth < window?.ActualWidth)
tt.X = _mStartOffset.X + offset.X * -1;
// if (-_mStartOffset.Y + canvas.ActualHeight < window?.ActualHeight)
tt.Y = _mStartOffset.Y + offset.Y;
}
private void Grid_MouseUp(object sender, MouseButtonEventArgs e)
{
var canvas = (Canvas)sender;
canvas.ReleaseMouseCapture();
}
我找到了解决方案,问题是Application.Current.MainWindow的位置返回0(但命运扭曲,它在调试模式下工作,正如我之前提到的(,当我使用(UIElement(Application.Current.Resources["MainWindow"]时,它就像一个魅力:(