Я перемещаю и увеличиваю масштабное количество (от 1 до 80) изображений (110 x 110 пикселей) синхронных сигналов. Каждое из отображаемых изображений представляет собой растровое изображение, загруженное с диска в элемент управления WPF Image
. Вход для манипуляции осуществляется с помощью событий сенсорной манипуляции (ManipulationDelta
).Улучшение работы с изображениями (перемещение и масштабирование)
Как только я пытаюсь манипулировать более чем несколькими изображениями (3 или 4), все начинает замедляться. Как я мог улучшить производительность моего решения?
Для манипуляции я использую следующий код:
Сенсорный ввод: Манипуляции
private void TouchManipulationContainer_ManipulationDelta(object sender,
ManipulationDeltaEventArgs e)
{
var scale = e.DeltaManipulation.Scale.X;
panAllSelected(e.DeltaManipulation.Translation.X,
e.DeltaManipulation.Translation.Y, scale);
}
private void panAllSelected(double x, double y, double scale)
{
foreach (var child in ImageGrid.Children)
{
if (child.GetType() == typeof(ImageDisplayContainer))
{
var tds = (child as ImageDisplayContainer);
if (tds.IsSelected) tds.TouchDisplayControl.MoveAndZoom(x, y, scale);
}
}
}
изображения:
public void MoveAndZoom(double DeltaX, double DeltaY, double DeltaZoom)
{
position.X += DeltaX;
position.Y += DeltaY;
scale += (DeltaZoom - 1.0);
MovableImage.SetValue(ImageCanvas.LeftProperty, position.X);
MovableImage.SetValue(ImageCanvas.TopProperty, position.Y);
var x = MovableImage.GetValue(ImageCanvas.LeftProperty);
var y = MovableImage.GetValue(ImageCanvas.TopProperty);
Console.WriteLine(x + "; " + y + "; " + scale);
if (scale != 1.0)
{
var sizeX = ImageCanvas.ActualWidth * scale;
var sizeY = ImageCanvas.ActualHeight * scale;
var size = Math.Max(sizeX, sizeY);
MovableImage.Width = Math.Abs(size);
MovableImage.Height = Math.Abs(size);
}
}
XAML:
<Grid ClipToBounds="True">
<Canvas x:Name="ImageCanvas" Background="Black">
<Image x:Name="MovableImage"
Source="/ImageInspector3;component/Images/Data/Thumbnails/ImageViewer_Series1.png"/>
</Canvas>
</Grid>
Означает ли это, у вас есть коллекция изображений, где перемещаются только выбранные и масштабируется, тогда как другие сохраняют свой размер и положение? После этого изображения перекрываются друг с другом? Пожалуйста, дайте немного больше объяснений о том, чего вы пытаетесь достичь, и о том, как приложение должно работать. – Clemens
Exaclty, у меня есть сетка изображений, нужно только выбрать выбранных. Изображения не должны перекрываться, но должны быть обрезаны в границах их ячеек. – DIF
Считаете ли вы использование общей RenderTransform? Поместите каждое изображение в контейнер фиксированного размера с помощью ClipToBounds = true, а затем назначьте тот же объект преобразования (например, MatrixTransform) в свойство RenderTransform всех выбранных элементов управления изображением. Теперь вы только манипулируете этим единственным объектом преобразования, не создавая новый макет для каждого события манипуляции. – Clemens