1

私はWPFが初めてで、スライダーにスタイルを追加しようとしていますが、オプションが多すぎて混乱してしまいます。

誰かが作るか、スライダーを次のように見せる方法を教えてください: スライダー 緑 = 合格、トラックの残りの灰色

そして、私はそれを曲の再生中に表示するために使用しようとしているので、灰色 = 残り、ドラッグすると曲のその部分にスキップするときにそれを実装する最も簡単な方法は何ですか.

私はNAudioを使用しています。次のようにして、曲の再生中にトラックバーを(残り時間で)スライドさせました。

private void dispatcherTimer_Tick(object sender, EventArgs e) {
   LabelCurrentTime.Content = _musicManager.getPlayTime();
   double totalseconds = _musicManager.totalSeconds();
   double currentseconds = _musicManager.currentSeconds();
   if (totalseconds > 0 && currentseconds > 0)
      Trackbar.Value = ((((Trackbar.Width / totalseconds) * currentseconds)) / totalseconds) * 10;
}

xamlで:

<Slider x:Name="Trackbar" Height="25" Canvas.Left="50" Canvas.Top="10" Width="408" Maximum="10"/>
4

2 に答える 2

2

どうぞ:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void Border_MouseDown(object sender, MouseButtonEventArgs e)
    {
        var mainborder = sender as Border;
        double x = e.GetPosition(mainborder).X;
        double val = 1 - (mainborder.ActualWidth - x) / mainborder.ActualWidth;
        slider.Value = val * (slider.Maximum - slider.Minimum) + slider.Minimum;
    }
}

public class SliderValueConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        double val = (double)values[0];
        double min = (double)values[1];
        double max = (double)values[2];
        double sliderWidth = (double)values[3];
        return sliderWidth * (val - min) / (max - min);
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

<Window x:Class="WpfTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:WpfTest"
    Title="MainWindow" Height="650" Width="825">
<Window.Resources>
    <local:SliderValueConverter x:Key="sliderValueConverter"/>
</Window.Resources>
<StackPanel>
    <Slider Maximum="200" Minimum="100" Name="slider">
        <Slider.Template>
            <ControlTemplate TargetType="{x:Type Slider}">
                <Border Background="Silver" Height="30" MouseDown="Border_MouseDown">
                    <Border Background="Green" HorizontalAlignment="Left">
                        <Border.Width>
                            <MultiBinding Converter="{StaticResource sliderValueConverter}">
                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Value"/>
                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Minimum"/>
                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="Maximum"/>
                                <Binding RelativeSource="{RelativeSource TemplatedParent}" Path="ActualWidth"/>
                            </MultiBinding>
                        </Border.Width>
                    </Border>
                </Border>
            </ControlTemplate>
        </Slider.Template>
    </Slider>
</StackPanel>

于 2012-11-01T20:28:39.063 に答える
0

これは完全な解決策ではありませんが、始めるには役立ちます。

WPF のすべてのコントロールには、外観と動作を定義する ControlTemplate があります。\

Slider コントロールの ControlTemplate は驚くほど (最初は) 複雑で、オンラインには多くの例があります。

MSDN の例を見てください。

于 2012-11-01T20:29:53.750 に答える