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

3

我正在绘制一个带有滑块的ContextMenu

这是我的实际代码:

<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个回答

3
你可以用不同的方式来实现这个功能。
你可以像在XAML代码中已经做过的那样使用绑定。
以下是你的按钮的代码:
<Button x:Name="btnBackgroundCodeBehind" Content="Code Behind Button" />

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

你可以在代码后端做(几乎)相同的事情。你的方法Slider_ChangeOpacity可能如下所示:
private void Slider_ChangeOpacity(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    btnBackgroundCodeBehind.Opacity = e.NewValue;
}

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

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

最佳方法取决于您的情况。如果您创建了一个复杂的程序,我会更喜欢绑定到视图模型。如果您只想为将来使用创建一个视图,则我会更喜欢直接绑定。如果您必须在配对(按钮和滑块)之间进行更复杂的数据操作,则应使用代码后台。

希望这回答了您的问题。


感谢您的回答。我的意图是仅使用XAML来完成此操作,当我的程序需要保存时,我将获取滑块的值,但我不知道如何获取该值,因为“menuSliderOpacity”无法访问。 - Kevin Kouketsu
在你的例子中,Value这个变量是不需要的吗?因为 ValueChanged 已经完成了它的工作。 - Kevin Kouketsu
那么,如果我需要获取或设置滑块的值,该怎么办?sliderOpacity是不可访问的。 - Kevin Kouketsu
我的应用程序需要在各个方面进行定制。而且我需要保存这些配置。我不想每次改变透明度都要放在结构体中,只有在关闭应用程序时才需要。如果做不到,我将使用valuechanged。 - Kevin Kouketsu
还有一件事,当我的应用程序启动时,我需要将滑块的值设置为上次的值。 - Kevin Kouketsu
显示剩余4条评论

1
我的解决方案是:

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

好的,我不知道如何正确使用Binding,所以我试图避免使用它。 只是用这段代码就实现了我想要的功能

    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));
    }

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