У меня есть диалоговое окно, которое открывается моим главным окном. Помимо прочего, он имеет собственный элемент управления, который я написал, который должен контролировать громкость любых элементов управления 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