2014-10-31 70 views
0

我有一个程序,其中有一个由GeometryModel3D表示的多维数据集,并且我有一个充满纹理的ListBox,保存在数据库中。每次双击鼠标时,我都试图更改多维数据集的纹理,但它不起作用。你可以帮我吗? 这里是源代码:MouseDoubleClick时无法更改ImageSource

<ModelVisual3D x:Name="floor"> 
        <ModelVisual3D.Content> 
         <Model3DGroup> 
          <DirectionalLight Color="#FFE2E0E0" Direction="-1,-1,-3" > 
          </DirectionalLight> 
          <GeometryModel3D x:Name="floorModel"> 
           <GeometryModel3D.Geometry> 
            <MeshGeometry3D x:Name="floorGeometry" Positions="{Binding FLoorPoints3D}" TriangleIndices="{Binding FloorPointsIndices}"               
             TextureCoordinates="0,1 0,0 1,0 1,1 1,1 -0,1 0,-0, 1,0 1,1 -0,1 0,-0 1,0 1,0 1,1 -0,1 0,-0 -0,0 -0,0 1,-0 1,1 0,1 1,-0 1,1 0,1 -0,1"/> 
           </GeometryModel3D.Geometry>         
          </GeometryModel3D> 
         </Model3DGroup> 
        </ModelVisual3D.Content> 
       </ModelVisual3D> 

    public int FloorImagesLoader(string query) 
    {    
     SqlConnection connection = new SqlConnection(connectionString); 
     SqlCommand command = new SqlCommand(query, connection); 
     SqlDataReader reader; 

     HomeDesigner.Converters converters = new Converters(); 

     List<HomeDesigner.Classes.Floor> floorImageList = new List<Classes.Floor>(); 
     HomeDesigner.Classes.Floor floorClass = new Classes.Floor(); 
     try 
     { 
      connection.Open(); 
      reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       { 

        floorImageList.Add(new HomeDesigner.Classes.Floor { FloorTextureID = (int)reader[0], Image = converters.ByteArrayToImage(((byte[])reader[1])) }); 
       } 
      } 
     } 
     finally 
     { 
      connection.Close(); 
     } 
     ListBoxImages.ItemsSource = floorImageList; 
     ID = floorClass.FloorTextureID; 

     return ID; 

    } 


BitmapImage textureImage = new BitmapImage(); 
    private void SetImageTexture() 
    { 

     int parquetIndex = 0; 

     ListBoxImages.MouseLeftButtonDown += (sender, e) => 
     { 
      if (ListBoxImages.ItemsSource != null) 
      { 
       if (buttonParquetClick == true) 
       { 
        if (e.LeftButton == MouseButtonState.Pressed && e.ClickCount == 2) 
        { 

         parquetIndex = ListBoxImages.SelectedIndex; 
         string parquete_Query = "SELECT FloorID, FloorImage FROM HomeDesigner.dbo.Floor where FloorTypeID=3"; 
         textureImage = TexturesLoader(parquete_Query, parquetIndex + 1); 

         ImageBrush imageBrush = new ImageBrush(); 
         imageBrush.ImageSource = textureImage;       
         floorModel.Material = new DiffuseMaterial(imageBrush); 


        } 
       } 
       else 
       { 

       } 

      } 
     }; 


    } 

回答

0

MouseLeftButtonDown事件已经由列表框类处理。您可以使用PreviewMouseLeftButtonDown代替:

ListBoxImages.PreviewMouseLeftButtonDown += (sender, e) => 
    { 
     ... 
    } 

,有当然没有必要在鼠标按下事件处理程序来检查e.LeftButton == MouseButtonState.Pressed

+0

我做了这些更改,但它仍然无法正常工作。 – Scarabey 2014-11-01 22:58:33

+0

不知道,它适用于我。你有没有在你的事件处理程序中设置一个断点来查看是否被调用? – Clemens 2014-11-02 12:08:29