我的主窗口打开了一个对话框。除此之外,它还有一个我编写的自定义控件,可以控制程序中任何MediaElement控件的音量。
音量控制包含2个按钮和一个ProgressBar。它有一个Volume DependencyProperty。单击音量增大按钮时,Volume属性的值增加5%;同样,单击音量减小按钮可将音量降低5%。这反映在ProgressBar中。我对ProgressBar的工作有信心,但我不会排除那里的问题。
该对话框有自己的Volume DependencyProperty,就像主窗口一样。我试图将Dialog中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绑定,Volume控件的绑定还是VolumeControl本身?
贝
答案 0 :(得分:1)
您似乎在这里有两个Volume
属性。第一个是VolumeControl
,您可以在其中显示代码。另一个在SettingsDialog
上,您只显示XAML。
您的TextBlock
和VolumeControl
都绑定到Volume
上的SettingsDialog
,但看起来不会更新该属性。您可能打算在VolumeControl
上使用TwoWay绑定,如下所示:
<cs:VolumeControl ...
Volume="{Binding Mode=TwoWay, Path=Volume, RelativeSource={RelativeSource AncestorType={x:Type c:SettingsDialog}}}" ... />