簡體   English   中英

WPF - 綁定 IsMouseOver 可見性

[英]WPF - Binding IsMouseOver Visibillity

I have a navigation bar where there are several buttons and when a button is selected I set the StrokeThickness to a certain value . 我的問題是,當我將鼠標移到按鈕上時,我觸發了IsMouseOver事件,該事件會在我離開按鈕后立即重置厚度。 這也應該發生,但不會發生在當前selected的按鈕上。 有沒有辦法綁定它並在selected按鈕時告訴事件取消操作或保持你的StrokeThickness

視圖模型:

    [Obsolete]
    public EinzelneFrageButtonViewModel()
    {

    }

    public EinzelneFrageButtonViewModel(Frage frage, int frageNummer)
    {
        CheckIsButtonEnabled(frage, frageNummer);
        Frage = frage;
        FrageNummer = frageNummer.ToString();
    }

    public EinzelneFrageButtonViewModel(Frage frage, int frageNummer, bool isSelected) : this(frage, frageNummer)
    {
        IsSelected = isSelected;
    }

    private void CheckIsButtonEnabled(Frage frage, int frageNummer)
    {
        if (frage == null || frageNummer < 1)
        {
            IsButtonEnabled = false;
        }
        else
        {
            IsButtonEnabled = true;
        }
    }

    private void OnFrageSelected(object obj)
    {
        if (!IsSelected)
        {
            IsSelected = true;
        }

        LoadSelectedFrage?.Invoke(this, new LoadSelectedFrageEventArgs(Frage, int.Parse(FrageNummer) - 1));
    }

    private bool m_isSelected;
    public bool IsSelected
    {
        get
        {
            return m_isSelected;
        }
        set
        {
            m_isSelected = value;
            StrokeThickness = m_isSelected ? 2.5 : 0;
            OnPropertyChanged();
        }
    }

    private bool m_isButtonEnabled;
    public bool IsButtonEnabled
    {
        get
        {
            return m_isButtonEnabled;
        }
        set
        {
            if (m_isButtonEnabled != value)
            {
                m_isButtonEnabled = value;
                OnPropertyChanged();
            }
        }
    }

    private string m_frageNummer;
    public string FrageNummer
    {
        get
        {
            return m_frageNummer;
        }
        set
        {                
            if (m_frageNummer != value)
            {
                m_frageNummer = value;
                if (m_frageNummer == "0")
                {
                    m_frageNummer = null;
                }
                OnPropertyChanged();
            }
        }
    }           

    private double m_strokeThickness;
    public double StrokeThickness
    {
        get
        {
            return m_strokeThickness;
        }
        set
        {
            // ReSharper disable once CompareOfFloatsByEqualityOperator
            if (m_strokeThickness != value)
            {
                m_strokeThickness = value;
                OnPropertyChanged();
            }
        }
    }

    public ICommand FrageSelectedCommand => new ActionCommand(OnFrageSelected);
}

XAML:

<Style x:Key="FrageButtonStyle" TargetType="{x:Type Button}" BasedOn="{StaticResource MaterialDesignRaisedButton}">

    <Setter Property="FontSize" Value="20" />
    <Setter Property="BorderThickness" Value="0" />
    <Setter Property="BorderBrush" Value="GhostWhite" />
    <Setter Property="FontFamily" Value="Arial" />
    <Setter Property="Background" Value="#0B8CF4" />
    <Setter Property="Foreground" Value="White" />
    <Setter Property="Height" Value="50"/>
    <Setter Property="Width" Value="53.8"/>

    <Style.Triggers>
        <Trigger Property="IsMouseOver" Value="True">
            <Trigger.EnterActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ThicknessAnimation Duration="0:0:0.300" To="2.5" Storyboard.TargetProperty="BorderThickness" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.EnterActions>
            <Trigger.ExitActions>
                <BeginStoryboard>
                    <Storyboard>
                        <ThicknessAnimation Duration="0:0:0.150" To="0" Storyboard.TargetProperty="BorderThickness" />
                    </Storyboard>
                </BeginStoryboard>
            </Trigger.ExitActions>
        </Trigger>
    </Style.Triggers>
</Style>

是的,您需要查看按鈕樣式和觸發器。 有 State 觸發器,它們根據 state 規定按鈕的樣式。您可以從頭開始制作這些或使用內置的。在您的情況下,我建議內置什么。

我還建議使用 ToggleButton,如果你還沒有,它已經有一個 IsChecked State。

這是 ToggleButton 的狀態和模板的 MSDN 鏈接,以獲取更多信息。 https://docs.microsoft.com/en-us/dotnet/desktop/wpf/controls/togglebutton-styles-and-templates?view=netframeworkdesktop-4.8#:~:text=ToggleButton%20States%20%20%20 %20VisualState%20Name%20,control%20is%20disabled.%20%208%20more%20rows%20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM