Wpf Перетаскивание прямоугольника на холст заставляет его мигать/мигатьC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Wpf Перетаскивание прямоугольника на холст заставляет его мигать/мигать

Сообщение Anonymous »

Я пытаюсь перетащить прямоугольник на пустой холст. Однако, когда я его перетаскиваю, он постоянно мигает/мигает.
Я поставил отладку, и координаты 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»