2011-07-04 229 views
1

我的xaml代码在下面;Key_Down event not firing,如何用键盘箭头移动摄像头

<Page x:Class="Ab3d.PowerToys.Samples.Objects3D.Model3DFactorySample" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:cameras="clr-namespace:Ab3d.Cameras;assembly=Ab3d.PowerToys" 
    xmlns:ab3d="clr-namespace:Ab3d.Controls;assembly=Ab3d.PowerToys" 
    xmlns:visuals="clr-namespace:Ab3d.Visuals;assembly=Ab3d.PowerToys"   
    Title="AllModelsSample" 
    MinWidth="600"> 
    <Page.Resources> 
     <DiffuseMaterial x:Key="ObjectsMaterial" Brush="#247589"/> 
    </Page.Resources> 
    <Grid Name="MainGrid"> 
     <Grid.Background> 
      <LinearGradientBrush StartPoint="0 0" EndPoint="0 1"> 
       <GradientStop Offset="0" Color="#033C62"/> 
       <GradientStop Offset="1" Color="#01131F"/> 
      </LinearGradientBrush> 
     </Grid.Background> 
     <Viewport3D Name="MainViewport"> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <Model3DGroup x:Name="MainModel3DGroup"/> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
      <ModelVisual3D> 
       <ModelVisual3D.Content> 
        <Model3DGroup> 
         <AmbientLight Color="#333333"/> 
        </Model3DGroup> 
       </ModelVisual3D.Content> 
      </ModelVisual3D> 
     </Viewport3D> 

     <cameras:SceneCamera Name="Camera1" Heading="30" Attitude="-10" Bank="0" Distance="10" ShowCameraLight="Always"/> 

     <!-- EventsSourceElement is set to MainGrid - this means that the MainGrid's mouse events are subscribed to - this enables camera rotation without the need to be over the rendered 3D element --> 
     <ab3d:MouseCameraController Name="MouseCameraController1" UsedMouseButton="Left" EventsSourceElement="{Binding ElementName=MainGrid}"/> 
     <ab3d:CameraControlPanel VerticalAlignment="Bottom" HorizontalAlignment="Left" Margin="5" Width="150" Height="75"/> 
     <Viewport3D x:Name="ViewPort" Margin="0,-10,0,0" KeyDown="Window_KeyDown"> 
      <Viewport3D.Camera> 
       <PerspectiveCamera x:Name="anakamera" FieldOfView="90" 
              Position="0.4,7,7.5" 
              LookDirection="0,-0.5,-1" 
              /> 
      </Viewport3D.Camera> 
     </Viewport3D> 
     <TextBlock FontWeight="Bold" FontSize="20" Foreground="Silver" Margin="10" VerticalAlignment="Top" HorizontalAlignment="Left" Text="3D objects created from code with Ab3d.Models.Model3DFactory"/> 
    </Grid> 
</Page> 

而且我xaml.cs代码如下

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 
using System.Windows.Media.Media3D; 

namespace Ab3d.PowerToys.Samples.Objects3D 
{ 
    /// <summary> 
    /// Interaction logic for Model3DFactorySample.xaml 
    /// </summary> 
    public partial class Model3DFactorySample : Page 
    { 

     public Model3DFactorySample() 
     { 
      InitializeComponent(); 

      CreateModels(); 
     } 

     ContainerUIElement3D barsContainer = new ContainerUIElement3D(); 
     mamuller mamuller = new mamuller(); 
     yuzeyler yuzeyler = new yuzeyler(); 
     public static ModelUIElement3D modelOlustur(
      Double x, 
      Double y, 
      Double z, 
      Double boy, 
      Double sag, 
      Double sol, 
      MeshGeometry3D mesh, Brush brush) 
     { 
      //Ab3d.Common.EventManager3D 
      ModelUIElement3D modelUIElement3D = new ModelUIElement3D() 
      { 
       Model = new GeometryModel3D(mesh, new DiffuseMaterial(brush)) 
      }; 

      Transform3DGroup transform = new Transform3DGroup(); 

      //ScaleY is ranged between 0.0 : 1.0, for 0% to 100% 
      transform.Children.Add(new ScaleTransform3D(sol, sag, boy));//boyutlar x sol y sag z uzunlk 

      transform.Children.Add(
       new TranslateTransform3D(x, y, z));///lokasyonları belırlenıyor x sag sol y asagı yukarı z derınlık 
      modelUIElement3D.Transform = transform; 
      return modelUIElement3D; 

     } 
     private void CreateModels() 
     { 
      Material material; 

      material = this.FindResource("ObjectsMaterial") as Material; 


      Brush renk = Brushes.Red; 
      ModelUIElement3D firin = modelOlustur(8.5, 1.6, -2.7, 0.1, 0.1, 0.1, (MeshGeometry3D)yuzeyler.Resources["fırın"], Brushes.Gray); 
      ModelUIElement3D sogutmaplt = modelOlustur(-7.6, 0.4, -2.7, 0.1, 0.1, 0.1, (MeshGeometry3D)yuzeyler.Resources["sogutmaplatformu"], Brushes.Gray); 
      ModelUIElement3D bar2 = modelOlustur(1, 2, 1, 0.1, 0.1, 0.1, (MeshGeometry3D)mamuller.Resources["12metreKOS-D"], renk); 
      ModelUIElement3D bar3 = modelOlustur(1, 2.077, 1, 0.1, 0.1, 0.1, (MeshGeometry3D)mamuller.Resources["12metreKOS-D"], Brushes.Yellow); 


      barsContainer.Children.Add(firin); 
      barsContainer.Children.Add(sogutmaplt); 

      barsContainer.Children.Add(bar2); 
      barsContainer.Children.Add(bar3); 

      //barsContainer.Children.Add(sogutmaplt); 
      //ViewPort.Children.Add(barsContainer); 
      MainViewport.Children.Add(barsContainer); 
      //string yon = "12metreKOS-D"; 



     } 


     #region klavye mouse işlmleri 

     private void Window_KeyDown(object sender, KeyEventArgs e) 
     { 
      if (e.Key == Key.N) 
      { 
       anakamera.Position = new Point3D(0.4, 7, 7.5); 
       anakamera.LookDirection = new Vector3D(0, -0.5, -1); 
      } 

      #region normal kamera ayarları 
      if (e.Key == Key.Left) 
      { 
       RotateTransform3D cameraspin = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), 10)); 
       cameraspin.CenterX = 0; 
       cameraspin.CenterY = anakamera.Position.Y; 
       cameraspin.CenterZ = 0; 
       (anakamera.Transform as MatrixTransform3D).Matrix *= cameraspin.Value; 
      } 

      if (e.Key == Key.Right) 
      { 
       RotateTransform3D cameraspin = new RotateTransform3D(new AxisAngleRotation3D(new Vector3D(0, 1, 0), -10)); 
       cameraspin.CenterX = 0; 

       cameraspin.CenterY = anakamera.Position.Y; 

       cameraspin.CenterZ = 0; 

       (anakamera.Transform as MatrixTransform3D).Matrix *= cameraspin.Value; 

      } 

      if (e.Key == Key.Up) 
      { 
       anakamera.Position = new Point3D(anakamera.Position.X, anakamera.Position.Y, anakamera.Position.Z - 0.1D); 

      } 

      if (e.Key == Key.Down) 
      { 
       anakamera.Position = new Point3D(anakamera.Position.X, anakamera.Position.Y, anakamera.Position.Z + 0.1D); 
      } 
      #endregion 
     } 
    } 
     #endregion 
} 

我试图使用键盘箭头移动相机,但我key_down事件不点火。 有反正我可以做到这一点? 谢谢

回答

1

我用这个ShowMoveButtons="{Binding ElementName=ShowMoveButtonsCheckBox, Path=IsChecked}"。那么问题就解决了

0

试试这个: <Page ... KeyDown="Window_KeyDown" Focusable="True">

然后,你必须确保,你的页面有KeyboardFocus。

+0

我试过,但没有工作:(。不要ü有任何其他的想法? – yunus

+0

你确定,该页面已键盘焦点?使用Snoop或其他一些WPF检查工具。 – WaltiD

+0

感谢UI解决问题。 – yunus