我想创建一个按布尔值和isMouseOver
值更改的按钮。
- 播放器正在播放 -> Pause_grey.png
- 播放器正在播放 & mouseIsOver-> Pause_blue.png
- 播放器已停止 -> Play_grey.png
- 播放器停止 & mouseIsOver -> Play_blue.png
我想用 4 执行此操作,MultiDataTrigger
但是当playStatus
(的布尔值dataContext
)更改时,按钮无法识别它
代码:
按钮:
<Button Name="btnPlayPause" Grid.Column="2" Grid.Row="0" Click="musikPlayer_btnClick" HorizontalAlignment="Center" Style="{StaticResource PlayPauseButton}"></Button>
按钮样式:
<Style TargetType="{x:Type Button}" x:Key="PlayPauseButton">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type Button}">
<StackPanel Orientation="Horizontal" >
<Image Name="PART_Image" Source="graphics/Pause_grey.png" VerticalAlignment="Center" RenderOptions.BitmapScalingMode="HighQuality" ></Image>
</StackPanel>
<ControlTemplate.Triggers>
<MultiDataTrigger >
<MultiDataTrigger.Conditions>
<!--is not playing and mouse is not over-->
<Condition Binding="{Binding playStatus}" Value="false"/>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="Source" Value="graphics/Play_grey.png" TargetName="PART_Image"/>
</MultiDataTrigger>
<MultiDataTrigger >
<MultiDataTrigger.Conditions>
<!--is not playing and mous is over-->
<Condition Binding="{Binding playStatus}" Value="false"/>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Source" Value="graphics/Play_blue.png" TargetName="PART_Image"/>
</MultiDataTrigger>
<MultiDataTrigger >
<MultiDataTrigger.Conditions>
<!--is playing and mous is not over-->
<Condition Binding="{Binding playStatus}" Value="true"/>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="Source" Value="graphics/Pause_grey.png" TargetName="PART_Image"/>
</MultiDataTrigger>
<MultiDataTrigger >
<MultiDataTrigger.Conditions>
<!--is playing and mouse is over-->
<Condition Binding="{Binding playStatusy}" Value="true"/>
<Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Source" Value="graphics/Pause_blue.png" TargetName="PART_Image"/>
</MultiDataTrigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
所以有人知道如何让这个工作吗?:)
编辑1:
我不知道如何设置,或者我是否可以设置INotifyPropertyChanged
,因为它的价值:
public Boolean playStatus { get { return !model.getMusicPlayer().getStream1_pause(); } }
EDIT2: 我试过了,但它不起作用
protected void OnPropertyChanged(PropertyChangedEventArgs e)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
handler(this, e);
}
protected void OnPropertyChanged(string propertyName)
{
OnPropertyChanged(new PropertyChangedEventArgs(propertyName));
}
public bool stream1_pause
{
get { return Stream1_pause; }
set
{
if (value != Stream1_pause)
{
Stream1_pause = value;
OnPropertyChanged("stream1_pause");
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
也许我应该像在 listView 中那样手动调用更新,但我不知道如何更新条件。在 ListView 中,它看起来像:
BindingOperations.GetBindingExpressionBase(songs, ListView.ItemsSourceProperty).UpdateTarget();
所以我尝试了:
BindingOperations.GetBindingExpressionBase(btnPlayPause, Button.StyleProperty).UpdateTarget();
但它说:
System.NullReferenceException
....问题是为什么?