2013-06-25 123 views
0

我想使用一个eventToCommand来确定何时用户鼠标滑块控件上。但它永远不会被解雇。这是一个包含数据的模板EventToCommand没有触发

<DataTemplate x:Key="RunEventsTemplate"> 
    <di:DIGroupBox Grid.Row="2" Header="Real-Time Modifications" DataContext="{Binding DataContext.ScenarioHelper.EventPlayingService,RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Page}}}" > 
     <Grid> 
      <Grid.RowDefinitions> 
       <RowDefinition Height="Auto" /> 
       <RowDefinition /> 
       <RowDefinition /> 
       <RowDefinition /> 
      </Grid.RowDefinitions> 
      <di:DIGroupBox Header="Audio" DataContext="{Binding CurrentAudioEvent}"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <di:DILabel Content="Filename: " /> 
        <di:DIComboBox Grid.Column="1" /> 
        <di:DICheckBox Grid.Row="1">Loop Audio File?</di:DICheckBox> 
        <di:DIImageToggleButton Grid.Row="1" Grid.Column="1" Height="23" Width="23" HorizontalAlignment="Left" Image="PlayIcon_White"></di:DIImageToggleButton> 
       </Grid> 
      </di:DIGroupBox> 
      <di:DIGroupBox Grid.Row="1" Header="Odors"> 
       <ItemsControl ItemsSource="{Binding VehicleOdors}" ItemTemplate="{StaticResource ScentTemplate}"> 
        <ItemsControl.ItemsPanel> 
         <ItemsPanelTemplate> 
          <WrapPanel></WrapPanel> 
         </ItemsPanelTemplate> 
        </ItemsControl.ItemsPanel> 
       </ItemsControl> 
      </di:DIGroupBox> 
      <di:DIGroupBox Grid.Row="2" Header="Lighting" DataContext="{Binding CurrentLightingEvent}"> 
       <Grid> 
        <Grid.RowDefinitions> 
         <RowDefinition /> 
         <RowDefinition /> 
        </Grid.RowDefinitions> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width=".3*" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <di:DILabel Content="Color: " /> 
        <di:DILabel Grid.Row="1" Content="Strobe: " /> 
        <StackPanel Grid.Column="1" Orientation="Horizontal"> 
         <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter={x:Null}}" Content="Off" Margin="0,0,5,0" Height="23" Width="50"></di:DIRadioButton> 
         <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=White}" Content="White" Margin="0,0,5,0" Height="23" Width="50" /> 
         <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=Red}" Content="Red" Margin="0,0,5,0" Height="23" Width="50"/> 
         <di:DIRadioButton DIRadioButtonStyle="ToggleButton" IsChecked="{Binding CurrentDMXLightColor,Converter={StaticResource enumConverter},ConverterParameter=Blue}" Content="Blue" Height="23" Width="50"/> 
        </StackPanel> 
        <StackPanel Grid.Row="1" Grid.Column="1" Orientation="Horizontal" VerticalAlignment="Center"> 
         <TextBlock Text="Always On" Foreground="White" VerticalAlignment="Center" TextWrapping="Wrap" MaxWidth="50" Margin="0,0,5,0" /> 
         <di:DISlider Minimum="0" Maximum="100" Value="{Binding StrobeRate}" > 
          <i:Interaction.Triggers> 
           <i:EventTrigger EventName="MouseUp"> 
             <cmd:EventToCommand Command="{Binding UserChangedSliderValueCommand}"></cmd:EventToCommand> 
           </i:EventTrigger> 
          </i:Interaction.Triggers> 
         </di:DISlider> 
         <TextBlock Text="Fast Strobe" Foreground="White" VerticalAlignment="Center" TextWrapping="Wrap" MaxWidth="50" /> 
        </StackPanel> 
       </Grid> 
      </di:DIGroupBox> 
      <di:DIGroupBox Header="Smoke" Grid.Row="3" DataContext="{Binding CurrentSmokeEvent}"> 
       <Grid> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="60" /> 
         <ColumnDefinition Width="Auto" /> 
         <ColumnDefinition /> 
        </Grid.ColumnDefinitions> 
        <di:DIToggleButton Content="Off" Width="50" Height="23"> 
         </di:DIToggleButton> 
        <di:DILabel Grid.Column="1" Content="Intensity:" Margin="10,0,0,0" /> 
        <di:DISlider Grid.Column="2" VerticalAlignment="Center" Value="{Binding Intensity}" Minimum="0" Maximum="100" > 

        </di:DISlider> 
       </Grid> 
      </di:DIGroupBox> 
     </Grid> 
    </di:DIGroupBox> 
</DataTemplate> 

的命令看起来像这样

private RelayCommand userChangedSliderValueCommand; 
    public RelayCommand UserChangedSliderValueCommand 
    { 
     get 
     { 
      return userChangedSliderValueCommand = (userChangedSliderValueCommand??new RelayCommand(() => 
       { 
        LightingEvent newLe = new LightingEvent(); 
        newLe.DMXLightColor = CurrentDMXLightColor; 
        newLe.StrobeRate = StrobeRate; 
        UserAddNewEvent(newLe); 
       } 
       )); 
     } 
    } 

我设置一个断点,它从来没有被击中内。我正在使用.net 4.5

+0

您是否在输出窗口中看到任何绑定错误? –

+0

尝试使用而不是 Krish

+0

首先,检查是否正确提升了“MouseUp”事件,因为这是第三方控件。然后如Krish所示,尝试使用InvokeCommandAction。如果仍不起作用,请检查您的装订。 –

回答

0

不确定您的DISlider是否可以将其作为标准WPF滑块执行此操作,但您可以尝试。首先,你应该得到的滑块时的对象,是指Get the Thumb of a Slider

private static Thumb GetThumb(Slider slider) 
{ 
    var track = slider.Template.FindName("PART_Track", slider) as Track; 
    return track == null ? null : track.Thumb; 
} 

然后你听拇指DragCompleted事件,在我的项目的例子:

​​

此外,还可以考虑结合您的滑块值。我认为这应该是一个更好的方法。如果它很难,你可以继承你的控件并添加一个依赖属性来实现它。

+0

那么这个私人功能会去哪里呢?我会制作一个自定义滑块吗? – joshwl2003

+0

在您的代码后面可以看到DISlider控件的位置。如果您的数据模板位于资源字典中并且很难隐藏代码,则可以将上述代码放在行为中,并使用该行为来管理这些事件,或者可以编写继承DISLider的自定义控件,将代码放入并使用它在你的数据模式中。 –

+0

感谢您的帮助。事实证明,您无法使用正常交互事件触发器绑定到路由事件。你必须让自己了。我找到了下面的博客来解释它http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html – joshwl2003