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