我是C#编程的新手,在C / C ++中有一点背景知识。我正在尝试写一个问题,就像均衡器一样,只是玩代码。想象一下5个垂直滑块彼此相邻,当你向上和向下移动中间滑块时,其他滑块会根据我稍后会弄清楚的哈希函数对特定值作出反应,此时我很简单方程。
然而,当我添加更多滑块时,我不想通过为每个滑块添加一个函数,所以有没有办法'检测'哪个滑块正在移动,并通过算法发送它来移动相邻的滑块?基本上,我想要一个功能将相邻的滑块移动到我选择移动的任何滑块上。从逻辑上讲,它是有道理的,但我不知道如何在代码中做到这一点。
我为特定滑块编写的功能如下。
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;
}
我可能没有完全解释,随意提问!
答案 0 :(得分: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;
}
答案 1 :(得分: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();
}
}
但是你需要为转换器工作。让我知道你的想法。