ブール値と値で変化するボタンを作成したい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>
誰でもこれを機能させる方法を知っていますか?:)
EDIT1:
方法がわからない、または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 でできるように update を手動で呼び出す必要があるかもしれませんが、条件を更新する方法がわかりません。ListView では次のようになります。
BindingOperations.GetBindingExpressionBase(songs, ListView.ItemsSourceProperty).UpdateTarget();
だから私は試しました:
BindingOperations.GetBindingExpressionBase(btnPlayPause, Button.StyleProperty).UpdateTarget();
しかし、それは言う:
System.NullReferenceException
……問題はなぜですか?