1

私はC#プログラミングに不慣れで、C /C++のバックグラウンドが少しあります。私は、コードで遊んでいるだけで、ほとんどイコライザーのような問題を書き込もうとしています。5つの垂直スライダーが隣り合っていると想像してください。中央のスライダーを上下に動かすと、他のスライダーは特定の値に反応します。ハッシュ関数に基づいて、後日わかります。方程式。

ただし、スライダーを追加するときは、スライダーごとに関数を追加したくないので、どのスライダーが移動しているかを「検出」し、アルゴリズムを介して送信して隣接するスライダーを移動する方法はありますか?スライダー?基本的に、1つの関数で、隣接するスライダーを、移動することを選択した任意のスライダーに移動したいと思います。論理的には理にかなっていますが、コードでそれを行う方法がわかりません。

特定のスライダー用に作成した関数は次のとおりです。

private void slider3_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {
        double adjacentSliders = ((slider3.Value) / 4) * 3;
        double adjacentSliders2 = ((slider3.Value) / 2);
        slider2.Value = slider4.Value = adjacentSliders;
        slider1.Value = slider5.Value = adjacentSliders2;
    }

十分に説明していないかもしれませんので、お気軽にご質問ください!

4

3 に答える 3

3
private void anySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
   var thisSlider = sender as Slider;
   ...
}

隣接するスライダーが必要な場合は、FormLoad でスライダーのリストを作成します。次に、のインデックスを見つけて、thisSliderそこから作業できます。

編集:コードの値を変更するときに WPF がイベントをトリガーするかどうかはわかりません。その場合、ループに入るのを防ぐためにこれが必要になる場合があります。

private static bool changingSlider = false;

private void anySlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    if (! changingSlider)
    {
        changingSlider = true;      
        var thisSlider = sender as Slider;
        ...
        changingSlider = false;
}
于 2013-01-15T18:40:35.563 に答える
0

私はしばらくの間C#とVisual Studioを使用していなかったので、ウィンドウデザイナーで配列を直接使用する方法があるかどうか思い出せません。誰かがコメントでそれをクリアする必要があります;)。

しかし、おそらく必要なのは、slider1、slider2、slider3、...を宣言する代わりに、slider [0]、slider [1]、...にアクセスできるように配列を使用する必要があります。

このためには、最初に配列を使用するようにフォームのデザインを変更してから、ハンドラーでこの配列にアクセスする必要があります。

配列なし:

        private System.Windows.Forms.TrackBar trackBar1;
        private System.Windows.Forms.TrackBar trackBar2;
        private System.Windows.Forms.TrackBar trackBar3;

        [...]

        this.trackBar1 = new System.Windows.Forms.TrackBar();
        this.trackBar2 = new System.Windows.Forms.TrackBar();
        this.trackBar3 = new System.Windows.Forms.TrackBar();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar1)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar2)).BeginInit();
        ((System.ComponentModel.ISupportInitialize)(this.trackBar3)).BeginInit();
        this.SuspendLayout();
        // 
        // trackBar1
        // 
        this.trackBar1.Location = new System.Drawing.Point(154, 80);
        this.trackBar1.Name = "trackBar1";
        this.trackBar1.Size = new System.Drawing.Size(104, 45);
        this.trackBar1.TabIndex = 0;
        // 
        // trackBar2
        // 
        this.trackBar2.Location = new System.Drawing.Point(154, 132);
        this.trackBar2.Name = "trackBar2";
        this.trackBar2.Size = new System.Drawing.Size(104, 45);
        this.trackBar2.TabIndex = 1;
        // 
        // trackBar3
        // 
        this.trackBar3.Location = new System.Drawing.Point(154, 184);
        this.trackBar3.Name = "trackBar3";
        this.trackBar3.Size = new System.Drawing.Size(104, 45);
        this.trackBar3.TabIndex = 2;

配列付き:

        private System.Windows.Forms.TrackBar[] trackBar = new System.Windows.Forms.TrackBar[3];

        [...]
        this.SuspendLayout();

        for(int n = 0; n < 3; n++) {
            this.trackBar[n] = new System.Windows.Forms.TrackBar();
            ((System.ComponentModel.ISupportInitialize)(this.trackBar[n])).BeginInit();

            this.trackBar[n].Location = new System.Drawing.Point(154, 80 + n*52);
            this.trackBar[n].Name = "trackBar[" + n + "]";
            this.trackBar[n].Size = new System.Drawing.Size(104, 45);
            this.trackBar[n].TabIndex = 0;
        }

次に、trackBar[x]を介してすべてのトラックバーにアクセスできます。宣言とforループの3を、必要な定数または変数に変更できます。

于 2013-01-15T18:54:34.427 に答える
0

xaml のみで実行することもできます。あなただけが必要ですFormulaCalculationConverter。私はそれを試してみましたが、うまくいきます。

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:WpfApplication2="clr-namespace:WpfApplication2"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <sys:Double x:Key="MyValueFour">4.0</sys:Double>
    <sys:Double x:Key="MyValueTwo">2.0</sys:Double>
    <WpfApplication2:FormulaCalculationConverter x:Key="FormulaCalculationConverter"/>
</Window.Resources>
<StackPanel>
    <Slider x:Name="BaseSlider" />
    <Slider>
        <Slider.Value>
            <MultiBinding Converter="{StaticResource FormulaCalculationConverter}">
                <Binding Path="Value" ElementName="BaseSlider" Mode="OneWay"  />
                <Binding Path="." Source="{StaticResource MyValueFour}" />
            </MultiBinding>
        </Slider.Value>
    </Slider>
    <Slider >
        <Slider.Value>
            <MultiBinding Converter="{StaticResource FormulaCalculationConverter}">
                <Binding Path="Value" ElementName="BaseSlider" Mode="OneWay"  />
                <Binding Path="." Source="{StaticResource MyValueTwo}" />
            </MultiBinding>
        </Slider.Value>
    </Slider>
    <Slider Value="{Binding Path=Value, ElementName=BaseSlider}"/>
</StackPanel>
</Window>

そして、次のようなコンバーターを作成しました

public class FormulaCalculationConverter : IMultiValueConverter
{
   // this is incomplete formula converter...
   public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
   {
       // strictly assume for 1 + 1
       double retVal = 0;
       if (values[0] == DependencyProperty.UnsetValue || values[1] == DependencyProperty.UnsetValue
           || values[0] == null || values[1] == null)
       {
           return Binding.DoNothing;
       }
       // apply logic to split formula here
       retVal = System.Convert.ToDouble(values[0]) + System.Convert.ToDouble(values[1]);
       return retVal;
   }

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

ただし、これにはコンバーターで作業する必要があります。あなたの考えを聞かせてください。

于 2013-01-16T03:14:37.343 に答える