在ContextMenu中访问滑块值

时间:2018-09-19 11:08:21

标签: c# wpf xaml

我正在画一个ContextMenu,里面有slider

这是我的实际代码:

<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>

现在这是我里面的信息。这个slider将控制屏幕上某物(例如button)的背景不透明度。首先,我尝试过:

在按钮上

{Binding ElementName=sliderOpacity, Path=Value}

或者类似“我的双向滑块方式的价值”之类的东西。 我如何建立联系?之后,我如何获取或设置代码隐藏滑块的值。

正确的方法是什么?

2 个答案:

答案 0 :(得分:3)

您可以通过不同的方式进行操作。

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

这可能是您按钮的代码:

<Button x:Name="btnBackgroundCodeBehind" Content="Code Behind Button" />

这是菜单的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>

您在(几乎)后面的代码中执行相同的操作。您的方法Slider_ChangeOpacity可能如下所示:

private void Slider_ChangeOpacity(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    btnBackgroundCodeBehind.Opacity = e.NewValue;
}

我说几乎是因为这只是一种单向解决方案,它只是从滑块到按钮。

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

最好的方法是根据您的情况。如果您创建一个复杂的程序,我希望绑定到视图模型。比起我希望直接绑定,您只想创建一个视图供您将来使用。如果必须对其中的数据(按钮和滑块)之间的数据进行更复杂的处理,则应在后面使用代码。

希望这可以回答您的问题。

答案 1 :(得分:1)

我的解决方法是:

new

好吧,我不知道如何正确使用Binding,所以我尝试避免这种情况。 只需这段代码,我就完成了我想要的

                <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>