2012-04-26 26 views
2

我一直在尋找幾個小時,但我找不到任何有用的東西。任何幫助感謝!如何將方法綁定到HoverButton?

我在用Coding4Fun工具包和MVVM模式編寫一個使用WPF的Kinect應用程序。

我想把我所有的與kinect有關的邏輯放在我的ViewModel中,並將這些方法綁定到HoverButton(在C4F工具包中找到)。 一個正常的按鈕有'命令'屬性,但是HoverButton沒有。

因此,在短期:

我想一個HoverButton的單擊事件綁定到我的視圖模型的方法。

我的XAML:

<Window x:Class="KinectTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:fun="clr-namespace:Coding4Fun.Kinect.Wpf.Controls;assembly=Coding4Fun.Kinect.Wpf" Title="MainWindow" Height="350" Width="525" 
    Loaded="WindowLoaded" 
    Closed="WindowClosed" 
    Cursor="None" 
    > 
<Grid Name="MainGrid" MouseMove="GridHoverMouseMove" DataContext="_viewModel"> 

    <Canvas Name="SkeletonCanvas" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Background="Black"> 
     <fun:HoverButton Name="KinectUp" ImageSource="/Images/blue_glass.png" ActiveImageSource="/Images/blue_glass.png" ImageSize="100" Canvas.Top="26" TimeInterval="1000"> 

     </fun:HoverButton> 
     <fun:HoverButton Name="KinectDown" ImageSource="/Images/red_glass.png" ActiveImageSource="/Images/red_glass.png" ImageSize="100" Canvas.Bottom="26" TimeInterval="1000"/> 

    </Canvas> 
    <Image Name="ColorImage" VerticalAlignment="Bottom" HorizontalAlignment="Right" Width="120" Height="120"></Image> 
      <TextBlock Name="Notification" Foreground="White" FontSize="50" VerticalAlignment="Top" HorizontalAlignment="Stretch" TextAlignment="Center" Text="{Binding Path=Notification, Mode=TwoWay}"></TextBlock> 
    <Canvas Name="CanvMouse" Background="Transparent" VerticalAlignment="Stretch" HorizontalAlignment="Stretch"> 
     <Image Name="imgMouse" Width="70" Source="/Images/handround_green.png"></Image> 
    </Canvas> 
</Grid> 
</Window> 

我的視圖模型:

internal class MainViewModel : INotifyPropertyChanged 
{ 

    public event PropertyChangedEventHandler PropertyChanged; 
    public ICommand KinectUpClick { get; private set; } 
    public ICommand KinectDownClick { get; private set; } 

    private string _notification = "Hello"; 
    public SensorHelper SensorHelper { get; set; } 

    public string Notification 
    { 
     get { return _notification; } 
     set 
     { 
      _notification = value; 
      PropertyChanged(this, new PropertyChangedEventArgs("Notification")); 
     } 
    } 



    public MainViewModel() 
    { 
     KinectUpClick = new RelayCommand(PerformKinectUpClick, CanKinectUpClick); 
     KinectDownClick = new RelayCommand(PerformKinectDownClick, CanKinectDownClick); 

    } 

    private bool CanKinectUpClick(object parameter) 
    { 
     return SensorHelper.CanMoveUp; 
    } 

    private bool CanKinectDownClick(object parameter) 
    { 
     return SensorHelper.CanMoveDown; 
    } 

    private void PerformKinectUpClick(object parameter) 
    { 

     ThreadPool.QueueUserWorkItem((o) => 
     { 
      Notification = "Kinect goes up!"; 
      SensorHelper.MoveAngle(5); 
      Notification = "Kinect ready..."; 
     }); 
    } 

    private void PerformKinectDownClick(object parameter) 
    { 
     ThreadPool.QueueUserWorkItem((o) => 
     { 
      Notification = "Kinect goes down!"; 
      SensorHelper.MoveAngle(-5); 
      Notification = "Kinect ready..."; 
     }); 
     ; 
    } 
} 
} 

我的代碼隱藏:

public partial class MainWindow : Window 
{ 
    private readonly MainViewModel _viewModel; 
    private SensorHelper _sensorHelper; 

    public MainWindow() 
    { 
     InitializeComponent(); 
     _viewModel = new MainViewModel(); 
     MainGrid.DataContext = _viewModel; 
    } 

    private void WindowLoaded(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      _sensorHelper = new SensorHelper(); 
     } 
     catch (Exception exception) 
     { 
      MessageBox.Show(exception.Message); 
     } 
     _viewModel.SensorHelper = _sensorHelper; 
     _sensorHelper.InitializeSkeleton(ref SkeletonCanvas); 
     //_sensorHelper.CaptureMouse(CanvMouse); 
     _sensorHelper.InitializeColorFrame(ColorImage); 
     _sensorHelper.StartKinect(); 
    } 



    private void WindowClosed(object sender, EventArgs eventArgs) 
    { 
     _sensorHelper.StopKinect(); 
    } 

    private void GridHoverMouseMove(object sender, MouseEventArgs e) 
    { 
     imgMouse.SetValue(Canvas.LeftProperty, e.GetPosition(CanvMouse).X - imgMouse.ActualWidth/2); 
     imgMouse.SetValue(Canvas.TopProperty, e.GetPosition(CanvMouse).Y - imgMouse.ActualHeight/2); 

     MouseHelper.CheckButton(KinectUp, imgMouse); 
     MouseHelper.CheckButton(KinectDown, imgMouse); 
    } 
} 

回答

3

好,非常小號你必須做的是通過使用可以在MVVMLight Toolkit中找到的EventToCommand將ICommand/Command綁定到事件。

您可以使用混合爲該以及

簡單的例子:

<Window 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:GalaSoft_MvvmLight_Command="clr-namespace:GalaSoft.MvvmLight.Command;assembly=GalaSoft.MvvmLight.Extras.WPF4" 
    x:Class="TestProject.Window5" 
    x:Name="Window" 
    Title="Window5" 
    Width="640" Height="480"> 

    <Grid x:Name="LayoutRoot"> 
     <Button Content="Button" HorizontalAlignment="Left" Height="69" Margin="92,117,0,0" VerticalAlignment="Top" Width="206"> 
      <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding Kinect.MyCommand, Source={StaticResource Locator}}"/> 
       </i:EventTrigger> 
      </i:Interaction.Triggers> 
     </Button> 
    </Grid> 
</Window> 
+0

的最佳解決方案,工作幾乎完全的我想要的方式,但由於某種原因..在文本框中的文本好好嘗試一下得到更新了...任何想法? – Yoeri 2012-04-26 13:02:30

+1

嘗試使用MVVMLight Toolkit中的「mvvminpc」-snippet。它適用於爲MVVM優化的屬性已更改的屬性! 我的例子是在Pastebin - http://pastebin.com/4uVYJd63 – 2012-04-26 13:08:27

+0

我安裝了MVVMLight與Nuget,但我似乎無法找到片段:(*從網上安裝* – Yoeri 2012-04-26 13:21:54

相關問題