如何在C# WPF中获取和绑定Slider的值?

4
我可以在这里获取滑块的值:
    public void TheSlider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
    {


        int k = (int)TheSlider.Value;

        Debug.WriteLine(k);

    }

在这部分中,我无法获取该值,因此无法使用它:
    private void Window_Loaded(object sender, RoutedEventArgs e)
    {
       _runtime.NuiCamera.ElevationAngle = (int)TheSlider.Value;
    }

这是XAML中的滑块代码:

    <Slider x:Name="TheSlider"
            DockPanel.Dock="Left"
            Orientation="Horizontal"
            HorizontalAlignment="Center"
            HorizontalContentAlignment="Center"
            Minimum="-27"
            Maximum="27"
            Cursor="Hand"
            IsSnapToTickEnabled="True"
            Margin="322,392,329,87" ValueChanged="TheSlider_ValueChanged" Width="144" />

这里有什么问题?你能帮我吗?这是关于IT技术的问题。更新:
        public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        System.Windows.Data.Binding b = new System.Windows.Data.Binding();
        b.ElementName = "TheSlider";
        b.Path = new PropertyPath("Value");
        SetBinding(ElevationAngleProperty, b);

    }

    public int ElevationAngle
    {
        get { return _runtime.NuiCamera.ElevationAngle; }

        set { _runtime.NuiCamera.ElevationAngle = value; OnPropertyChanged("ElevationAngle"); }
    }


    public DependencyProperty ElevationAngleProperty { get; set; }

嗯...你并不是真正的绑定,就像我们在WPF中知道的那样。现在你可以在TheSlider_ValueChanged方法内改变你的ElevationAngle。 - NestorArturo
我做到了,但当我把它放在TheSlider_ValueChanged方法中时,应用程序就停止运行了。ElevationAngle必须在Window_Loaded方法中。:S - Samet
听起来很奇怪。有报错吗? - NestorArturo
@NestorArturo 当我创建一个按钮并在按钮方法中写入“_runtime.NuiCamera.ElevationAngle = (int)TheSlider.Value;”时,它可以正常工作并设置值。但是如果我只使用滑块,应用程序会显示错误并关闭,没有任何错误解释。因此,我可以通过按钮和滑块来实现,但不能仅使用滑块。 - Samet
2个回答

9

当我只想将滑块的值作为标签内容设置时,我只需使用以下代码:

<Label Content="{Binding ElementName=mySlider, Path=Value}"/>

每当滑块的值更改时,您只需保存该值即可将其显示为整数。
<Slider  Name="mySlider" ValueChanged="SliderValueChanged" />

...
this.sliderValue = (int) mySlider.Value;

然后将您的标签内容绑定到它上。

0
如果ElevationAngle是依赖属性,你可以直接将依赖属性绑定到滑块值。在OnApplyTemplate函数中执行此操作。
public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            Binding b = new Binding();
            b.ElementName = "TheSlider";
            b.Path = new PropertyPath("Value");
            SetBinding(ElevationAngleProperty, b);

        }

如果它是常规的CLR属性,那么将滑块的值属性与ElevationAngle绑定。
       <Slider x:Name="TheSlider"                     DockPanel.Dock="Left"                     Orientation="Horizontal"                     HorizontalAlignment="Center"                     HorizontalContentAlignment="Center"                     Minimum="-27"                     Maximum="27"                     Cursor="Hand"                     IsSnapToTickEnabled="True"                     Margin="322,392,329,87" ValueChanged="TheSlider_ValueChanged" Width="144" Value="{Binding Path=ElevationAngle,Mode=OneWayToSource}"
/>   

请注意,这里的 ElevationAngle 在更改时应发送通知。
public int ElevationAngle 
        {
            get { return _elevationAngle ; }

            set { _elevationAngle  = value; OnPropertyChanged("ElevationAngle ");}
        }

你的代码在 SetBinding(ElevationAngleProperty, b) 和 OnPropertyChanged("ElevationAngle") 处出现错误。请您检查一下我代码中上面的更新。我哪里做错了吗? - Samet
嗨,Sameet,你似乎正在同时使用这两个解决方案。 不要创建ElevationAngleProperty,只需将滑块的值绑定到ElevationAngle即可。它应该可以工作。步骤:
  1. 删除OnApplyTemplate函数和ElevationAngleProperty
  2. 将滑块的值绑定到ElevationAngle
- Avani Vadera

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接