2013-06-25 6 views
0

Я пытаюсь использовать eventToCommand, чтобы определить, когда пользователь нажимает на ползунок. Однако он никогда не срабатывает. Это содержится в шаблонеEventToCommand not firing

<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», поскольку это сторонний элемент управления. Затем, как предложил Криш, попробуйте InvokeCommandAction. Если он все еще не работает, проверьте привязку. –

ответ

0

Не уверен, может ли ваш DISlider сделать это в качестве стандартного WPF Slider, но вы можете попробовать. Во-первых, вы должны получить объект Thumb слайдера, обратитесь к 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 событие большого пальца, пример в моем проекте:

#region Manage Deferred Scrolling 

    void VerticalScrollBarLoaded(object sender, RoutedEventArgs e) 
    { 
     VerticalScrollBar.Track.Thumb.DragStarted -= ThumbDragStarted; 
     VerticalScrollBar.Track.Thumb.DragCompleted -= ThumbDragCompleted; 
     VerticalScrollBar.Track.Thumb.DragStarted += ThumbDragStarted; 
     VerticalScrollBar.Track.Thumb.DragCompleted += ThumbDragCompleted; 
    } 

    void ThumbDragCompleted(object sender, DragCompletedEventArgs e) 
    { 
     IsDeferredScrolling = false; 
     if (CancelSelectionCrossingPage) 
      SelectionSettings.SelectedCells.Clear(); 
    } 

    void ThumbDragStarted(object sender, DragStartedEventArgs e) 
    { 
     IsDeferredScrolling = true; 
    } 

    #endregion 

Кроме того, вы можете рассмотреть связывание ваше значение слайдера. Я думаю, что это должен быть лучший способ. Если это сложно, вы можете наследовать свой контроль и добавить свойство зависимостей для достижения этого.

+0

Итак, куда бы отправилась эта частная функция? Будет ли я создавать пользовательский слайдер? – joshwl2003

+0

В вашем коде, где находится элемент управления DISlider. Если ваш datatemplate находится в ресурсном словаре, и трудно получить код позади, вы можете поставить выше код в Поведении и использовать поведение для управления этими событиями, или вы можете написать собственный элемент управления, наследующий DISlider, поместить в него код и использовать это в вашем datatemplate. –

+0

Спасибо за помощь. Оказывается, вы не можете привязываться к маршрутизируемому событию с помощью триггера события нормальных взаимодействий. Вы должны сделать свой собственный. Я нашел следующий блог, чтобы объяснить его http://joyfulwpf.blogspot.com/2009/05/mvvm-invoking-command-on-attached-event.html – joshwl2003