Обработка событий MouseLeftButtonDown и MouseLeftButtonUp у контрола - Slider
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.
Создаем новый проект. И добавляем стандартный слайдер.
Теперь нам надо отредактировать темплейт стандартного слайдера. Для этого кликаем в верхней части экрана (см. скрин).
После того как мы вошли в редактирование темплейта.
В левой панели откроется компоненты из которых состоит наш слайдер, нас интересует HorizontalThumb. Заходим в его свойства, и переходим на панель событий находим события DragStarted и DragCompleted.
Это способ очень удобен тем, что на самом деле нам с вами не надо писать код, все за нас генерируется Blend Studio. Что мне не нравиться в этом подходе, что необходимо все это делать обязательно через Blend Studio. Генерируемый код иногда вызывает сбои в работе самой Blend Studio, это конечно неприятно, но и мне как не очень нравиться когда слишком много XAML кода, он становится крайне сложно поддерживаемый и непонятный. И к тому же плохо отлаживаемый! Это конечно чисто мое мнение. Оба метода работают, и могут быть использованы. Да и на самом деле они делают одно и тоже обрабатывают события Thumb.
Popularity: 33% [?]





Октябрь 1st, 2008 at 18:14
Как раз то, что я долго искала. Спасибо
Октябрь 29th, 2008 at 19:06
Класно! Нашел, наконец толковый блог на просторах интернета) Ура!
Ноябрь 1st, 2008 at 16:39
Очень полезная информация. Silver Light мне понравился