1

我想创建一个按布尔值和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

....问题是为什么?

4

0 回答 0