5

スライダー テンプレートのトラックにツールチップ (以下を参照) を追加しましたが、スライダーの現在の値にバインドするのではなく、マウスが置かれている「トラック値」に対応する値にバインドしたいと考えています。YouTube ビデオ スライダーが許可するものと同様です。そのため、ユーザーは実際に親指を動かさなくても、トラックにマウスオーバーして対応する値を確認できます。

<Track Grid.Row="1" Name="PART_Track" ToolTip="{Binding Path=Value}" ToolTipService.Placement="Mouse">
</Track>

何か案は?ありがとう!

4

3 に答える 3

0

まず、Slider コントロールを変更する必要があります

    <Slider VerticalAlignment="Center" HorizontalAlignment="Stretch">
        <Slider.Template>
            <ControlTemplate TargetType="{x:Type Slider}">
                <Grid>
                    <xamlTest:ReflectablePopup x:Name="InfoPopup" Width="Auto" Height="Auto" PlacementTarget="{Binding ElementName=Thumb}" Placement="Top" StaysOpen="False" IsOpen="False" AllowsTransparency="True">
                        <Border Padding="2" CornerRadius="3" Background="#555C5C5C">
                            <Label Content="Your Text"></Label>
                        </Border>
                    </xamlTest:ReflectablePopup>
                    <Track x:Name="PART_Track">
                        <Track.Thumb>
                            <Thumb x:Name="Thumb" Width="10" Height="20">
                            </Thumb>
                        </Track.Thumb>
                    </Track>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger SourceName="Thumb" Property="IsDragging" Value="True">
                        <Setter Value="True" TargetName="InfoPopup" Property="IsOpen" />
                    </Trigger>
                    <Trigger SourceName="Thumb" Property="IsDragging" Value="False">
                        <Setter Value="False" TargetName="InfoPopup" Property="IsOpen" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Slider.Template>
    </Slider>

ご覧のとおり、Popup の代わりに ReflectablePopup を使用しています。PlacementTargetが移動した後に Popup を再配置できないためです。

ReflectablePopup (C#) のコードの下:

public class ReflectablePopup : Popup
{
    protected override void OnOpened(EventArgs e)
    {
        var friend = this.PlacementTarget;
        friend.QueryCursor += friend_QueryCursor;

        base.OnOpened(e);
    }

    protected override void OnClosed(EventArgs e)
    {
        var friend = this.PlacementTarget;
        friend.QueryCursor -= friend_QueryCursor;

        base.OnClosed(e);
    }

    private void friend_QueryCursor(object sender, System.Windows.Input.QueryCursorEventArgs e)
    {
        this.HorizontalOffset += +0.1;
        this.HorizontalOffset += -0.1;
    }
}
于 2015-04-10T10:44:19.573 に答える
0

スライダーから継承して、新しいコントロールを作成する必要があると思います。mousein/out と mousemove を実装し、マウス オフセットに基づいて値を計算し、ツールチップを変更する必要があります。

「箱から出して」使用できるプロパティはないと思うので、マージンの再スキン化などを考慮する必要がある場合、計算はかなり難しいかもしれません.

于 2009-07-24T14:49:47.707 に答える