Я пытаюсь перетащить прямоугольник на пустой холст. Однако, когда я его перетаскиваю, он постоянно мигает/мигает.
Я поставил отладку, и координаты x и y перескакивают между тем, где сейчас находится мой курсор мыши, и несколькими перетаскиваниями? позади? имеет ли это смысл?
Пример:
Обновление X: 638, обновление Y: 382.66666666666663
Обновление X: 319.33333333333337, Обновление Y: 302.66666666666663
Обновление X: 638, обновление Y: 382.66666666666663
Обновление X: 319.33333333333337, обновление Y: 302.66666666666663
Я думаю, проблема сейчас в этой области:
Canvas.Left="{Binding SelectionRectangle.X}"
Canvas.Top="{Binding SelectionRectangle.Y}"
Если я установлю статические числа, мигание прекратится, но я не смогу создать прямоугольник из любой начальной точки.
Вот мой вид:< /p>
Вот xaml.cs, лежащий в основе моего представления:
public partial class CanvasWindow : Window
{
public CanvasWindow()
{
InitializeComponent();
var vm = new CanvasWindowViewModel();
DataContext = vm;
vm.OnRequestClose += (s, e) => this.Close();
}
private async void Window_Loaded(object sender, RoutedEventArgs e)
{
// Get the ViewModel instance from the DataContext
if (DataContext is CanvasWindowViewModel viewModel)
{
await viewModel.WindowLoaded();
}
}
private void Canvas_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
var viewModel = DataContext as CanvasWindowViewModel;
if (viewModel != null)
{
viewModel.StartDrawingCommand.Execute(e);
}
}
private void Canvas_MouseMove(object sender, MouseEventArgs e)
{
var viewModel = DataContext as CanvasWindowViewModel;
if (viewModel != null)
{
viewModel.UpdateDrawingCommand.Execute(e);
}
}
private void Canvas_MouseLeftButtonUp(object sender, MouseEventArgs e)
{
var viewModel = DataContext as CanvasWindowViewModel;
if (viewModel != null)
{
viewModel.EndDrawingCommand.Execute(e);
}
}
}
Вот моя модель представления:
public class CanvasWindowViewModel : INotifyPropertyChanged
{
public ICommand StartDrawingCommand { get; }
public ICommand UpdateDrawingCommand { get; }
public ICommand EndDrawingCommand { get; }
public CanvasWindowViewModel()
{
StartDrawingCommand = new DelegateCommand(StartDrawing);
UpdateDrawingCommand = new DelegateCommand(UpdateDrawing);
EndDrawingCommand = new DelegateCommand(EndDrawing);
}
private Rect _selectionRectangle;
public Rect SelectionRectangle
{
get => _selectionRectangle;
set
{
_selectionRectangle = value;
RaisePropertyChanged(nameof(SelectionRectangle));
}
}
private bool _isDrawing;
public bool IsDrawing
{
get => _isDrawing;
set
{
_isDrawing = value;
RaisePropertyChanged(nameof(IsDrawing));
}
}
private Point _startPoint;
private void StartDrawing(MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Pressed)
{
_startPoint = e.GetPosition(e.Source as IInputElement);
SelectionRectangle = new Rect(_startPoint, new Size(0, 0));
IsDrawing = true;
Debug.WriteLine($"Start X: {_startPoint.X}, Start Y: {_startPoint.Y}");
}
}
private void UpdateDrawing(MouseEventArgs e)
{
if (IsDrawing)
{
var currentPoint = e.GetPosition(e.Source as IInputElement);
var x = Math.Min(currentPoint.X, _startPoint.X);
var y = Math.Min(currentPoint.Y, _startPoint.Y);
var width = Math.Abs(currentPoint.X - _startPoint.X);
var height = Math.Abs(currentPoint.Y - _startPoint.Y);
SelectionRectangle = new Rect(x, y, width, height);
Debug.WriteLine($"Update X: {currentPoint.X}, Update Y: {currentPoint.Y}");
}
}
private void EndDrawing(MouseButtonEventArgs e)
{
if (e.LeftButton == MouseButtonState.Released)
{
IsDrawing = false;
Debug.WriteLine("Drawing Ended");
}
}
public ObservableCollection Pages { get; } = new ObservableCollection();
public event EventHandler OnRequestClose;
public async Task WindowLoaded()
{
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void RaisePropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Подробнее здесь: https://stackoverflow.com/questions/786 ... lash-blink
Wpf Перетаскивание прямоугольника на холст заставляет его мигать/мигать ⇐ C#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение