Добавление второго большого пальца к ползунку в WPF - PullRequest
3 голосов
/ 16 июня 2009

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

http://www.codeplex.com/AvalonControlsLib

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

Bob

Ответы [ 2 ]

3 голосов
/ 24 июня 2010

Я предполагаю, что вы пытаетесь использовать элементы управления 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;
}

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

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

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

0 голосов
/ 10 июля 2009

Вы можете связать свойство IsOpen ToolTip со свойством IsDragging Thumb

...