У меня есть вид в виде спирали с 4 прямоугольниками, когда я щелкаю один из них, я хочу, чтобы камера видела этот прямоугольник. Мой код работает нормально, но как только я немного прокручиваю с помощью колесика мыши (для увеличения / уменьшения), то уже невозможно щелкать и просматривать поле, как я хочу. Идет то же событие щелчка мышью, и я не замечаю никакой разницы при отладке. Просто камера не двигается. Прокрутка как-то все портит, но я не знаю как и что делать. РЕДАКТИРОВАТЬ: также щелчок правой кнопкой мыши и перемещение камеры таким образом вызывает ту же ошибку.
<helix:HelixViewport3D x:Name="View"
Background="{DynamicResource ControlBackgroundBrush}"
ItemsSource="{Binding Visuals}"
ShowCameraInfo="False"
ShowCoordinateSystem="True"
ShowViewCube="False"
ZoomExtentsWhenLoaded="False"
ModelUpDirection="0,1,0"
DefaultCamera="{Binding DefCamera}"
>
<helix:HelixViewport3D.Camera>
<PerspectiveCamera FieldOfView="61"
LookDirection="{Binding LookDirection}"
Position="{Binding CameraPosition}"
UpDirection="0,1,0" />
</helix:HelixViewport3D.Camera>
<!-- Selecting is done by first deselecting all boxes on mouse down
then selecting the correct one on mouse up -->
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseLeftButtonDown">
<cal:ActionMessage MethodName="DeselectAll" />
</i:EventTrigger>
</i:Interaction.Triggers>
</helix:HelixViewport3D>
Этот класс UIElement
определяет прозрачную рамку вокруг оригинальной рамки. При нажатии запускается действие selectionChanged в родительском классе. Это действие вычисляет новую Позицию и Lookdirection, которые связаны в XAML выше.
public class InteractiveBoxVisual3D : System.Windows.UIElement3D
{
public int SensorID { get; set; }
public bool IsSelected { get; set; }
private System.Action SelectionChanged;
/// <summary>
/// Constructor
/// </summary>
/// <param name="mat">Matrix which defines the position and rotation</param>
/// <param name="box">Box defines the box size in XYZ</param>
/// <param name="sensorID">Sensor ID of the sensor</param>
/// <param name="selectionChanged">Action run when box is selected or deselected</param>
public InteractiveBoxVisual3D(Matrix3D mat, Box3D box, int sensorID, System.Action selectionChanged)
{
SensorID = sensorID;
IsSelected = false;
SelectionChanged = selectionChanged;
Material material = MaterialHelper.CreateMaterial(Colors.Transparent);
MeshBuilder meshBuilder = new MeshBuilder();
Vector3D VX = new Vector3D(mat.M11, mat.M12, mat.M13);
Vector3D VY = new Vector3D(mat.M21, mat.M22, mat.M23);
// This selection box is larger by this amount, to avoid graphical errors
int margin = 10;
meshBuilder.AddBox(new Point3D(mat.OffsetX, mat.OffsetY, mat.OffsetZ), VX, VY, box.Lx + margin, box.Wy + margin, box.Hz + margin);
Visual3DModel = new GeometryModel3D(meshBuilder.ToMesh(), material);
}
public void Select()
{
GeometryModel3D box = Visual3DModel as GeometryModel3D;
box.Material = MaterialHelper.CreateMaterial(Colors.White);
IsSelected = true;
SelectionChanged.Invoke();
}
public void DeSelect()
{
GeometryModel3D box = Visual3DModel as GeometryModel3D;
box.Material = MaterialHelper.CreateMaterial(Colors.Transparent);
IsSelected = false;
SelectionChanged.Invoke();
}
// There is a simulaneous mouse DOWN event which runs DeselectAll()
protected override void OnMouseUp(System.Windows.Input.MouseButtonEventArgs e)
{
if (e.LeftButton == System.Windows.Input.MouseButtonState.Released)
{
Select();
e.Handled = true;
}
}
}