Доступ к значению слайдера внутри ContextMenu - PullRequest
0 голосов
/ 19 сентября 2018

Я рисую 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}

Или что-то вроде моего значения на слайдере в двухстороннем режиме.Как я могу сделать эту ассоциацию?И после того, как я мог получить или установить значение ползунка на codebehind.

Какой правильный путь?

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Мое решение было:

                <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));
    }
0 голосов
/ 19 сентября 2018

Вы можете сделать это по-разному.

Вы можете использовать привязку, как вы уже использовали в своем коде 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Вы можете привязаться к модели представления.

Что лучше всего сделать, так это решать вашу ситуацию.Если вы создаете сложную программу, я бы предпочел привязку к модели представления.Если вы хотите создать только представление для будущего использования, я бы предпочел прямую привязку.В случае, если вам нужно выполнить более сложные манипуляции с данными между парой (кнопка и ползунок), следует использовать код позади.

Надеюсь, это ответит на ваши вопросы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...