C# 在上下文菜单中访问滑块值

C# 在上下文菜单中访问滑块值,c#,wpf,xaml,C#,Wpf,Xaml,我在画一个上下文菜单,里面有一个滑块 这是我的实际代码: <MenuItem x:Name="menuSliderOpacity" Header="Opacidade" Width="100"> <MenuItem.Template> <ControlTemplate TargetType="{x:Type MenuItem}"> <Slider Width="100"

我在画一个
上下文菜单
,里面有一个
滑块

这是我的实际代码:

<MenuItem  x:Name="menuSliderOpacity" Header="Opacidade" Width="100">
    <MenuItem.Template>
        <ControlTemplate TargetType="{x:Type MenuItem}">
            <Slider Width="100" 
                    Name="sliderOpacity" 
                    Minimum="0" 
                    Maximum="1" 
                    TickFrequency="0.1" 
                    IsSnapToTickEnabled="True"
                    ValueChanged="Slider_ChangeOpacity"
                    Value="{Binding ElementName=btnBackground, Path=Opacity, Mode=TwoWay}"/>
        </ControlTemplate>
    </MenuItem.Template>
</MenuItem>
或者类似于我的双向模式滑块上的值。 我怎样才能建立这种联系?之后,我如何获取或设置codebehind上slider的值


正确的方法是什么?

你可以用不同的方法来做

您可以像在XAML代码中一样使用绑定

这可能是按钮的代码:


这是菜单的XAML代码:

<Menu Grid.Column="2">
    <MenuItem x:Name="menuSliderOpacity" Header="Opacidade" Width="100">
        <MenuItem.Template>
            <ControlTemplate TargetType="{x:Type MenuItem}">
                <Slider Width="100" 
                x:Name="sliderOpacity" 
                Minimum="0" 
                Maximum="1" 
                TickFrequency="0.1" 
                IsSnapToTickEnabled="True"
                ValueChanged="Slider_ChangeOpacity"
                Value="{Binding ElementName=btnBackground, Path=Opacity, Mode=OneWayToSource}"/>
          </ControlTemplate>
    </MenuItem.Template>
</MenuItem>

在代码隐藏中,您可以(几乎)执行相同的操作。您的方法滑块的不透明度可能如下所示:

private void Slider\u ChangeOpacity(对象发送方,RoutedPropertyChangedEventArgs e)
{
btnBackgroundCodeBehind.Opacity=e.NewValue;
}
我说这几乎是因为这只是一个单向解决方案,它只是从滑块到按钮

如果要使用MVVM结构,可以绑定到视图模型

最好的办法是根据你的情况而定。如果您创建一个复杂的程序,我更喜欢绑定到视图模型。您是否只想创建一个视图供将来使用,而不是直接绑定。如果您必须对数据进行更复杂的操作,则该对(按钮和滑块)应使用代码隐藏

希望这能回答你的问题

我的解决方案是:

                <MenuItem Width="120" x:Name="menuSlider">
                    <MenuItem.Template>
                        <ControlTemplate TargetType="{x:Type MenuItem}">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="auto"/>
                                    <RowDefinition Height="auto"/>
                                </Grid.RowDefinitions>
                                <Label Grid.Row="0">Opacidade</Label>
                                <Slider 
                                    Grid.Row="1"
                                    Margin="5,5,5,5"
                                    Width="100" 
                                    Name="sliderOpacity" 
                                    Minimum="0" 
                                    Maximum="1" 
                                    TickFrequency="0.1" 
                                    IsSnapToTickEnabled="True"
                                    Value="{Binding OpacityBackground,Mode=TwoWay}"/>
                            </Grid>
                        </ControlTemplate>
                    </MenuItem.Template>
                </MenuItem>

谢谢你的回答。我的意图是只使用XAML来实现这一点,当我的程序需要保存时,我将获取slider的值,但我不知道如何获取该值,
menuslidepropacity
是不可访问的。在您的示例中,
value
是不必要的吗?ValueChanged正在做这项工作。@shepher:谢谢你的提示,当然没有必要绑定它。我从你的第一篇文章中复制了它。所以,如果我需要获取或设置滑块值,我该怎么做?SlideRoCapacity无法使用。有什么原因让你想为此创建一个模板吗?
<Menu Grid.Column="2">
    <MenuItem x:Name="menuSliderOpacity" Header="Opacidade" Width="100">
        <MenuItem.Template>
            <ControlTemplate TargetType="{x:Type MenuItem}">
                <Slider Width="100" 
                x:Name="sliderOpacity" 
                Minimum="0" 
                Maximum="1" 
                TickFrequency="0.1" 
                IsSnapToTickEnabled="True"
                ValueChanged="Slider_ChangeOpacity"
                Value="{Binding ElementName=btnBackground, Path=Opacity, Mode=OneWayToSource}"/>
          </ControlTemplate>
    </MenuItem.Template>
</MenuItem>
private void Slider_ChangeOpacity(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    btnBackgroundCodeBehind.Opacity = e.NewValue;
}
                <MenuItem Width="120" x:Name="menuSlider">
                    <MenuItem.Template>
                        <ControlTemplate TargetType="{x:Type MenuItem}">
                            <Grid>
                                <Grid.RowDefinitions>
                                    <RowDefinition Height="auto"/>
                                    <RowDefinition Height="auto"/>
                                </Grid.RowDefinitions>
                                <Label Grid.Row="0">Opacidade</Label>
                                <Slider 
                                    Grid.Row="1"
                                    Margin="5,5,5,5"
                                    Width="100" 
                                    Name="sliderOpacity" 
                                    Minimum="0" 
                                    Maximum="1" 
                                    TickFrequency="0.1" 
                                    IsSnapToTickEnabled="True"
                                    Value="{Binding OpacityBackground,Mode=TwoWay}"/>
                            </Grid>
                        </ControlTemplate>
                    </MenuItem.Template>
                </MenuItem>
    public double OpacityBackground
    {
        get { return btnBackground.Opacity; }
        set
        {
            btnBackground.Opacity = value;
            OnPropertyChanged("OpacityBackground");

            OnPanelChangeData?.Invoke(this, new OnPanelChangeArgs()
            {
                Value = btnBackground.Opacity.ToString(),
                Type = OnChangeType.Opacity
            });
        }
    }

    // Create the OnPropertyChanged method to raise the event
    protected void OnPropertyChanged(string name)
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }