Custom Slider

После выхода на свет Silver Light beta 2 я столкнулся с проблемой, что у меня не работают события MouseLeftButtonDown и MouseLeftButtonUp. Ну как уже известно, Майкрософт изменило порядок обработки событий и фактически они существуют, но ничего не делают.

И так представленный мной пример – видео плеера, будет работать некорректно в бета 2. Что конечно совсем не радует, что же делать в таком случае.

Создадим свой класс CustomSlider в нем сделаем обработчики событий у ползунка (Thumb), которые позволят нам отслеживать необходимые нам действия. Оформим его в виде отдельного файла CustomSlider.cs:

using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;

namespace Quantumart.Silverlight.Controls
{
	public class CustomSlider : Slider
	{
		//Определяем стиль по умолчанию  - от стандартного Slider
		public CustomSlider()
			: base()
		{
			DefaultStyleKey = typeof(Slider);
		}

		///
		///Происходит в тот момент, когда мы кликнули по ползунку и начали перетаскивать его
		///
		public event EventHandler ThumbDragStarted;

		///
		/// Происходит когда мы закончили перенос ползунка
		///
		public event EventHandler ThumbDragCompleted;
		public override void OnApplyTemplate()
		{
			base.OnApplyTemplate();

			//Достаем ползунок
			Thumb thumb = this.GetTemplateChild("HorizontalThumb") as Thumb;

			//Если он существует, его можно и удалить;))
			if (thumb != null)
			{
				//задаем обработчики событий DragStarted и DragCompleted
				thumb.DragStarted += new DragStartedEventHandler(thumb_DragStarted);
				thumb.DragCompleted += new DragCompletedEventHandler(thumb_DragCompleted);
			}
		}

		//обработчик события по завершению переноса ползунка
		void thumb_DragCompleted(object sender, EventArgs e)
		{
			OnThumbDragCompleted(this, new EventArgs());
		}

		//обработчик собюытия ан начало переноса ползунка
		void thumb_DragStarted(object sender, EventArgs e)
		{
			OnThumbDragStarted(this, new EventArgs());
		}

		//вызываем  необходимые нам события
		public virtual void OnThumbDragStarted(object sender, EventArgs e)
		{
			if (ThumbDragStarted != null)
				ThumbDragStarted(sender, e);
		}

		//вызываем  необходимые нам события
		protected virtual void OnThumbDragCompleted(object sender, EventArgs e)
		{
			if (ThumbDragCompleted != null)
				ThumbDragCompleted(sender, e);
		}
	}
}

 
 

Теперь используем наш слайдер в XAML:


<UserControl x:Class="Quantumart.Silverlight.Controls.MPLayer"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:CC="clr-namespace: Silverlight.Controls;assembly= Silverlight.Controls"
  Width="400" Height="100" xmlns:vsm="clr-namespace:System.Windows;assembly=System.Windows">
  	<Grid x:Name="LayoutRoot" ShowGridLines="True">
		< CC:CustomSlider x:Name="PlayerSlider" Width="300" Canvas.Left="55"
			ThumbDragStarted="PlayerSlider_ThumbDragStarted"
			ThumbDragCompleted="PlayerSlider_ThumbDragCompleted" /></Grid>
  </UserControl>

Выполняем действия по происшествию событий:

private void PlayerSlider_ThumbDragStarted(object sender, EventArgs e)
{
	//Какие то действия по началу
}

private void PlayerSlider_ThumbDragCompleted(object sender, EventArgs e)
{
	//Какие то действия по окончанию
}

Вот такой выход есть решения этой проблемы он не единственный. Второй вариант несколько проще, но идет с использование VSM. Для нам необходимо использовать Blend Studio.

Создаем новый проект. И добавляем стандартный слайдер.

Теперь нам надо отредактировать темплейт стандартного слайдера. Для этого кликаем в верхней части экрана (см. скрин).

http://silverlightru.net/

После того как мы вошли в редактирование темплейта.

http://silverlightru.net/

В левой панели откроется компоненты из которых состоит наш слайдер, нас интересует HorizontalThumb. Заходим в его свойства, и переходим на панель событий находим события DragStarted и DragCompleted.

http://silverlightru.net/

http://silverlightru.net/

Это способ очень удобен тем, что на самом деле нам с вами не надо писать код, все за нас генерируется Blend Studio. Что мне не нравиться в этом подходе, что необходимо все это делать обязательно через Blend Studio. Генерируемый код иногда вызывает сбои в работе самой Blend Studio, это конечно неприятно, но и мне как не очень нравиться когда слишком много XAML кода, он становится крайне сложно поддерживаемый и непонятный. И к тому же плохо отлаживаемый! Это конечно чисто мое мнение. Оба метода работают, и могут быть использованы. Да и на самом деле они делают одно и тоже обрабатывают события Thumb.

Popularity: 73%

Похожие статьи по SilverLight:

  1. Обработка событий в Silverlight
  2. Изменения в обработке событий MouseLeftButtonDown/Up/Move в Silverlight 2.0
  3. DataBinding (часть 2 – метод вынесения контрола)
  4. События и их обработка SilverLight 1.0
  5. Обнаружение смены сети в Silverlight