Привязка WPF не работает, но я не получаю никаких сообщений об ошибках в окне «Вывод» - PullRequest
1 голос
/ 22 июля 2011

У меня есть диалоговое окно, которое открывается моим главным окном. Помимо прочего, он имеет собственный элемент управления, который я написал, который должен контролировать громкость любых элементов управления MediaElement в программе.

Регулятор громкости содержит 2 кнопки и панель ProgressBar. Имеет свойство зависимости от объема. Когда вы нажимаете кнопку увеличения громкости, значение свойства Volume увеличивается на 5%; аналогично, нажатие на кнопку уменьшения громкости уменьшает громкость на 5%. Это отражено в ProgressBar. Я уверен, что ProgressBar работает, но я не буду исключать проблем там.

Диалоговое окно имеет свой собственный Volume DependencyProperty, как и главное окно, в этом отношении. Я попытался привязать свойство Volume элемента управления Volume в диалоговом окне к свойству Volume диалога. Я даже добавил текстовое поле в диалоговое окно, чтобы сообщить мне значение свойства Volume. Я подумал, что мне это нужно, чтобы убедиться, что громкость диалога действительно меняется. Кажется, он совсем не меняется.

Вот выдержка из xaml для диалогового окна. В нем отсутствуют некоторые вещи, которые не связаны с этой проблемой.

<Window x:Class="CarSystem.SettingsDialog" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:c="clr-namespace:CarSystem"
        xmlns:cs="clr-namespace:CarSystem.CustomControls;assembly=CustomControls" 
        Closed="SettingsDialog_Closed"
        Height="300" 
        ResizeMode="NoResize" 
        Title="Settings" 
        Width="550" 
        WindowStartupLocation="CenterOwner" 
        WindowStyle="None">

    <StackPanel>

        <StackPanel Grid.Column="2" Orientation="Horizontal">
            <TextBlock FontSize="20" 
                       FontWeight="Bold" 
                       Foreground="White" 
                       Margin="10" 
                       Text="Volume: " 
                       VerticalAlignment="Center" />
            <TextBlock FontSize="20" 
                       FontWeight="Bold" 
                       Foreground="White" 
                       Margin="10" 
                       Text="{Binding Mode=OneWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" 
                       VerticalAlignment="Center" />
        </StackPanel>

        <StackPanel>

            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>

                <cs:VolumeControl Grid.Row="0" 
                              Height="60" 
                                  HorizontalAlignment="Left" 
                                  Margin="20,0,0,0" 
                                  Volume="{Binding Mode=OneWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" 
                                  Width="325" />

                <Button Background="#FF3C4B66" 
                        Click="CloseButton_Click" 
                        Content="Close" 
                        FontSize="20" 
                        FontWeight="Bold" 
                        Foreground="White" 
                        Grid.Row="1" 
                        Height="50"
                        HorizontalAlignment="Right" 
                        Margin="0,5,20,5" 
                        Width="125" />
                </Grid>
            </StackPanel>
        </Border>

    </StackPanel>

</Window>

Вот код для регулятора громкости:

public partial class VolumeControl : Control {

    public static readonly DependencyProperty VolumeProperty = 
        DependencyProperty.Register( "Volume", typeof( double ), typeof( VolumeControl ), new FrameworkPropertyMetadata( 0.50 ) );

    public double Volume {
        get { return (double) GetValue( VolumeProperty ); }
        set { SetValue( VolumeProperty, value ); }
    }

    public VolumeControl() {
        Loaded += WasLoaded;
    }

    static VolumeControl() {
        DefaultStyleKeyProperty.OverrideMetadata( typeof( VolumeControl ), new FrameworkPropertyMetadata( typeof( VolumeControl ) ) );
    }

    private void VolumeDown_Click( object sender, RoutedEventArgs e ) {
        Volume = Math.Max( 0, Volume - 0.05 );
    }

    private void VolumeUp_Click( object sender, RoutedEventArgs e ) {
        Volume = Math.Min( 1.0, Volume + 0.05 );
    }

    private void WasLoaded( object sender, EventArgs e ) {
        RepeatButton VolumeUpButton = (RepeatButton) Template.FindName( "PART_VolumeUp", this );
        if ( VolumeUpButton != null ) {
            VolumeUpButton.Click += VolumeUp_Click;
        }

        RepeatButton VolumeDnButton = (RepeatButton) Template.FindName( "PART_VolumeDown", this );
        if ( VolumeDnButton != null ) {
            VolumeDnButton.Click += VolumeDown_Click;
        }
    }
}

Как я уже сказал, в окне «Вывод» не отображаются сообщения об ошибках, что и делает WPF в случае сбоя привязки. Однако значение, отображаемое TextBlock, которое привязано к свойству Volume диалога, не изменяется. Проблема в привязке TextBlock, привязке регулятора громкости или в самом VolumeControl?

Tony

1 Ответ

1 голос
/ 22 июля 2011

Похоже, что у вас есть два Volume свойства в игре здесь.Первый на VolumeControl, для которого вы показываете код.Другой - на SettingsDialog, для которого вы показываете только XAML.

Ваши TextBlock и VolumeControl оба связаны с Volume на вашем SettingsDialog, но это не выглядиткак бы ничего не обновило бы это свойство.Вы, вероятно, хотели использовать привязку TwoWay к VolumeControl, например:

<cs:VolumeControl ...
    Volume="{Binding Mode=TwoWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" ... />
...