2

最小0と最大100のスライダーがあります。

スライダーにマウスを合わせるとポップアップ ウィンドウが表示されます。
現在、ポップアップをスライダーの値にバインドしています。

私が欲しいのは
、マウスをスライダーの上に移動すると、その位置にあると思われる値を確認したいということです。

例えば:
ここに画像の説明を入力

私のXAML:

<Window x:Class="WPFMavka.VideoPlayer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFMavka"
        Title="MainWindow" WindowStyle="None" Width="1920" Height="1080" WindowState="Maximized" KeyboardNavigation.TabNavigation="None" Closing="Window_Closing">
    <Grid Name="tst">
        <local:MetroSlider x:Name="bla" MouseMove="Rectangle_MouseMove" MouseLeave="Rectangle_MouseLeave" IsMoveToPointEnabled="True" HorizontalAlignment="Left" Width="542" VerticalAlignment="Top" Margin="116,839,0,0" Value="0" Style="{DynamicResource SliderStyle1}" Height="66" AutoToolTipPrecision="0" AutoToolTipPlacement="TopLeft"/>
        <Popup Name="floatingTip" AllowsTransparency="True" Placement="Relative"  PlacementTarget="{Binding ElementName=bla}">
            <Border BorderBrush="Black" BorderThickness="1" Padding="4">
                <TextBlock Text="{Binding ElementName=bla, Path=Value}"></TextBlock>
            </Border>
        </Popup>
    </Grid>
</Window>

私のコードビハインド:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Controls.Primitives;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace WPFMavka
{
    /// <summary>
    /// Interaction logic for VideoPlayer.xaml
    /// </summary>
    public partial class VideoPlayer : Window
    {
        public VideoPlayer()
        {
            InitializeComponent();
        }

        private void Window_Closing(object sender, System.ComponentModel.CancelEventArgs e)
        {
            Environment.Exit(1);
        }

        private void Rectangle_MouseMove(object sender, MouseEventArgs e)
        {
            if (!floatingTip.IsOpen) { floatingTip.IsOpen = true; }

            Point currentPos = e.GetPosition(bla);

            floatingTip.HorizontalOffset = currentPos.X-14;
            floatingTip.VerticalOffset = -32;
        }

        private void Rectangle_MouseLeave(object sender, MouseEventArgs e)
        {
            floatingTip.IsOpen = false;
        }
    }
}
4

2 に答える 2

2

より良い解決策を見つけました-TextBlock onMouseOverスライドを変更します>スライダー上のマウスの現在の位置を取得してから使用します.ValueFromPoint()

XAML:

<Window x:Class="WPFMavka.VideoPlayer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFMavka"
        Title="MainWindow" WindowStyle="None" Width="1920" Height="1080" WindowState="Maximized" KeyboardNavigation.TabNavigation="None" Closing="Window_Closing">
    <Grid Name="tst">
        <local:MetroSlider x:Name="slider" MouseMove="slider_MouseMove" MouseLeave="slider_MouseLeave" IsMoveToPointEnabled="True" HorizontalAlignment="Left" Width="746" VerticalAlignment="Top" Margin="330,851,0,0" Value="0" Style="{DynamicResource SliderStyle1}" Height="44"/>
        <Popup Name="floatingTip" AllowsTransparency="True" Placement="Relative"  PlacementTarget="{Binding ElementName=slider}">
            <Border Name="floatingTipBorder" BorderBrush="Black" BorderThickness="1" Padding="4">
                <TextBlock Name="sliderTextBlock"/>
            </Border>
        </Popup>
    </Grid>
</Window>

コード ビハインド:

private void slider_MouseMove(object sender, MouseEventArgs e)
{
   if (!floatingTip.IsOpen) { floatingTip.IsOpen = true; }

   Point currentPos = e.GetPosition(slider);
   Track _track = slider.Template.FindName("PART_Track", slider) as Track;

   sliderTextBlock.Text = _track.ValueFromPoint(currentPos).ToString();

   floatingTip.HorizontalOffset = currentPos.X -(floatingTipBorder.ActualWidth / 2);
   floatingTip.VerticalOffset = -32;
}

private void slider_MouseLeave(object sender, MouseEventArgs e)
{
   floatingTip.IsOpen = false;
}
于 2013-09-12T17:39:57.087 に答える
1

AttachedCommandこれには s を使用できます。ライブラリはここからダウンロードできます。したがって、この場合、次のようなことができます。

<Window x:Class="WPFMavka.VideoPlayer"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:WPFMavka"
        xmlns:AttachedCommand="clr-namespace:AttachedCommandBehavior;assembly=AttachedCommandBehavior" 
        Title="MainWindow" 
        WindowStyle="None" 
        Width="1920" 
        Height="1080" 
        WindowState="Maximized" 
        KeyboardNavigation.TabNavigation="None" 
        Closing="Window_Closing">
    <Grid Name="tst">
        <local:MetroSlider x:Name="bla" 
                           MouseMove="Rectangle_MouseMove" 
                           MouseLeave="Rectangle_MouseLeave" 
                           IsMoveToPointEnabled="True" 
                           HorizontalAlignment="Left" 
                           Width="542" VerticalAlignment="Top" 
                           Margin="116,839,0,0" 
                           Value="0" 
                           Style="{DynamicResource SliderStyle1}" 
                           Height="66" AutoToolTipPrecision="0" 
                           AutoToolTipPlacement="TopLeft"
                           AttachedCommand:CommandBehavior.Event="MouseMove" 
                           AttachedCommand:CommandBehavior.Command="{Binding UpdateCurrentMouseTimeCommand}" 
                           AttachedCommand:CommandBehavior.CommandParameter="{Binding ElementName=Bla, Path=Value}"/>
        <Popup Name="floatingTip" AllowsTransparency="True" 
               Placement="Relative" 
               PlacementTarget="{Binding ElementName=bla}">
            <Border BorderBrush="Black" BorderThickness="1" Padding="4">
                <TextBlock Text="{Binding CurrentMouseTime, NotifyOnSourceUpdated=True, Mode=OneWay}" />
            </Border>
        </Popup>
    </Grid>
</Window>

次に、コマンドUpdateCurrentMouseTimeCommandでプロパティを設定します

private string currentMouseTime = String.Empty;
public string CurrentMouseTime
{
    get { return value; }
    set 
    {
        if (currentMouseTime == value)
            return;
        currentMouseTime = value;
        OnPropertyChanged("CurrentMouseTime");
    }
}

包含クラスが実装する必要がある場所INotifyPropertyChanged

これが役立つことを願っています。

于 2013-09-12T09:14:38.237 に答える