Добавление второго большого пальца к ползунку в WPF

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

http://www.codeplex.com/AvalonControlsLib

На всю жизнь я не могу заставить всплывающую подсказку появляться над каждым большим пальцем (с текущим значением), пока он перемещается. Он покажет короткую всплывающую подсказку при наведении мыши, но она исчезнет при перемещении большого пальца. Кто-нибудь знает что-нибудь об этом конкретном элементе управления или о том, как добавить второй большой палец к ползунку и использовать его таким же образом? Я нашел этот основной вопрос на нескольких форумах без ответа, кроме ссылки на приведенную выше ссылку. Конечно, люди всегда упоминают, как это просто, не показывая и не объясняя, как бы вы это сделали. Заранее спасибо.

Боб


person Beaker    schedule 15.06.2009    source источник


Ответы (2)


Я предполагаю, что вы пытаетесь использовать элементы управления Avalon отсюда: Элементы управления Avalon

Я добавил всплывающую подсказку к миниатюрам в шаблоне элемента управления и назвал ее PART_LeftToolTip.

<ControlTemplate TargetType="{x:Type Controls:RangeSlider}">
    <StackPanel Orientation="Horizontal" Name="PART_RangeSliderContainer">
         <RepeatButton Name="PART_LeftEdge"/>                        
         <Thumb Name="PART_LeftThumb" Cursor="SizeWE">
               <Thumb.ToolTip>
                     <ToolTip Name="PART_LeftToolTip" />        
               </Thumb.ToolTip>
          </Thumb>                                             
          <Thumb Name="PART_MiddleThumb" Cursor="ScrollWE" MinWidth="1"/>
          <Thumb Name="PART_RightThumb" Cursor="SizeWE">
                <Thumb.ToolTip>
                      <ToolTip Name="PART_RightToolTip" />
                </Thumb.ToolTip>
          </Thumb>
          <RepeatButton Name="PART_RightEdge"/>
      </StackPanel>
</ControlTemplate>

Я добавил их как части шаблона в элемент управления RangeSlider.

TemplatePart(Name = "PART_LeftToolTip", Type = typeof(ToolTip)),
TemplatePart(Name = "PART_RightToolTip", Type = typeof(ToolTip))]
public sealed class RangeSlider : Control

В методе OnApplyTemplate я сделал следующее

_leftPreviewToolTip = EnforceInstance<ToolTip>("PART_LeftToolTip");
_rightPreviewToolTip = EnforceInstance<ToolTip>("PART_RightToolTip");

Внутри метода InitializeVisualElements я добавил следующее

private void InitializeVisualElementsContainer()
{
   // ** same as before ** //

   _leftPreviewToolTip.PlacementTarget = _leftThumb;
   _rightPreviewToolTip.PlacementTarget = _rightThumb;
}

Теперь самое интересное: в основном вы хотите отображать эту всплывающую подсказку при перемещении больших пальцев. Для левой всплывающей подсказки вы хотите, чтобы она отображалась при перемещении левого большого пальца или при перемещении центрального большого пальца. Я создал метод ShowLeftTooltip и вызвал его из LeftThumbDragDelta и CenterThumbDragDelta соответственно.

private void ShowLeftToolTip()
{
    _leftPreviewToolTip.IsOpen = AutoToolTip;
    // This is a little trick to cause the ToolTip to update its position next to the Thumb
    _leftPreviewToolTip.HorizontalOffset = _leftPreviewToolTip.HorizontalOffset == 0.0 ? 0.001 : 0.0;
}

Этот совет по перемещению всплывающей подсказки - это не то, о чем я думал, я получил его где-то в другом посте.

Я оставлю читателю упражнение по реализации правильной всплывающей подсказки.

Вы можете стилизовать всплывающую подсказку, чтобы обеспечить гибкое отображение. Не забудьте дать всплывающей подсказке что-то в качестве контекста данных, чтобы она не была пустой.

person lifeofmle    schedule 24.06.2010

Вы можете привязать свойство IsOpen ToolTip к свойству IsDragging Thumb

person Thomas Levesque    schedule 10.07.2009
comment
Если это не сработает, возможно, вы могли бы переопределить шаблон Thumb, чтобы включить Popup с его IsOpen, привязанным к IsDragging Thumb. - person Ray Burns; 19.11.2009