【问题标题】:Change Button Content and Text Based On Previous Click根据上一次单击更改按钮内容和文本
【发布时间】:2012-04-04 03:10:29
【问题描述】:

我想根据之前的内容点击来改变按钮内容。例如,如果是Add,则应更改为Save,如果是Save,则应更改回Add

我知道如何更改按钮的内容。但是如何阅读内容来做出改变?

【问题讨论】:

    标签: c# .net wpf windows


    【解决方案1】:

    如果您使用的是 MVVM,请将内容绑定到一个值并将命令绑​​定到函数。

    <Button Content="{Binding ButtonText}" Command="{Binding ButtonClickCommand}"/>
    

    当然,您可以在 ViewModel 中将 String ButtonText 和 ButtonClickCommand 作为属性。

    private string _ButtonText;
    public string ButtonText
    {
        get { return _ButtonText ?? (_ButtonText = "Add"); }
        set
        { 
            _ButtonText = value;
            NotifyPropertyChanged("ButtonText"); 
        }
    }
    
    private ICommand _ButtonClickCommand;
    public ICommand ButtonClickCommand
    {
        get { return _ButtonClickCommand ?? (_ButtonClickCommand = _AddCommand); }
        set
        {
            _ButtonClickCommand = value;
            NotifyPropertyChanged("ButtonClickCommand");
        }
    } 
    
    private ICommand _AddCommand = new RelayCommand(f => Add());
    private ICommand _SaveCommand = new RelayCommand(f => Save());
    
    private void Add()
    {
        // Add your stuff here
    
        // Now switch the button   
        ButtonText = "Save";
        ButtonClickCommand = SaveCommand;
    }
    
    private void Save()
    {
        // Save your stuff here
    
        // Now switch the button   
        ButtonText = "Add";
        ButtonClickCommand = AddCommand;
    }
    

    然后您可以让 ButtonClickCommand 更改属性,并且绑定会处理所有事情。

    【讨论】:

    • 如何让 NotifyPropertyChanged() 可以访问?您必须实施什么?
    • 当我回答这个问题时,我可能正在使用一个已经实现 NotifyPropertyChanged 的​​ ViewModelBase。请参阅本文的第 2 步:rhyous.com/2010/12/29/…
    • 我建议您在回答中说明这一点,例如您正在使用哪些命名空间(对显示 using 语句非常有帮助)以及您正在扩展什么。
    【解决方案2】:

    将最后一次点击的值存储在该按钮的标签属性中,并在点击时检查其值。

    标签说明

    获取或设置可用于存储有关此元素的自定义信息的任意对象值。

    MSDN Link

    void MyButton_OnClick(object sender, RoutedEventArgs e)
    {
        if(mybutton.Content.ToString() == "Add")
        {
            \\ Lines for add
            mybutton.Content = "Save";
        }
        else
        {
            \\ Lines for Save
            mybutton.Content = "Add";    
        }
    }
    

    【讨论】:

    • 这不是你在 WPF 中展示的方式。也许在 WinForms 中。
    【解决方案3】:

    我同意 Surfens 的回答,即这里的问题不是 ToggleButton 的完美示例,因为“保存”和“添加”是完全不同的操作,每个操作都应该在各自的按钮上设置自己的“ICommand”。

    但这里有一些样式会根据 ToggleButton 的 IsChecked 值更改内容。

    如果未选中按钮,内容将为“ValueForUnToggledState”,选中时变为“ValueForToggledState”

    <ToggleButton>
        <ToggleButton.Style>
            <Style TargetType="{x:Type ToggleButton}">
                <Setter Property="Content" Value="ValueForUnToggledState" />
                <Style.Triggers>
                    <Trigger Property="IsChecked" Value="True">
                        <Setter Property="Content" Value="ValueForToggledState" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </ToggleButton.Style>
    </ToggleButton>
    

    这比其他一些答案更像 WPF。

    【讨论】:

      【解决方案4】:

      另一种设计可能是,如果创建 2 个按钮,例如 AddButtonSaveButton,则可以分别显示或隐藏它们(使用 Visibility 属性)。

      为什么?

      因为这是一个关注点分离的问题。例如,在单击处理程序中,您不需要检查您所处的模式,因为您将拥有单独的处理程序。您还希望按钮具有不同的图标、不同的工具提示等。

      【讨论】:

        【解决方案5】:

        您还可以使用带有 EventTriggers 的 ToggleButton 来执行 Checked 和 Unchecked 状态的不同方法。

        <ToggleButton x:Name="ToggleButton" Content="Add"
                      Style="{StaticResource ToggleStyle}"
                      IsThreeState="False">
             <i:Interaction.Triggers>
              <i:EventTrigger EventName="Checked">
              <ei:CallMethodAction MethodName="Save" TargetObject="{Binding}" />
             </i:EventTrigger>
             <i:EventTrigger EventName="Unchecked">
               <ei:CallMethodAction MethodName="Add" TargetObject="{Binding}" />
             </i:EventTrigger>
         </i:Interaction.Triggers>
         </ToggleButton>
        

        您还可以使用样式来修改 ToggleButton 模板并更改选中状态的文本。为此,获取 ToggleButton 样式的副本,然后在 Checked VisualState 中将其添加到情节提要:

        <ObjectAnimationUsingKeyFrames Storyboard.TargetName="contentPresenter" Storyboard.TargetProperty="(UIElement.Content)">
         <DiscreteObjectKeyFrame KeyTime="0">
            <DiscreteObjectKeyFrame.Value>
                 Save
            </DiscreteObjectKeyFrame.Value>
           </DiscreteObjectKeyFrame>
         </ObjectAnimationUsingKeyFrames>
        

        如果您不想走那条路,那么您可以将其添加到您的检查触发器中:

        <ei:ChangePropertyAction PropertyName="ButtonText" Value="Save"/>
        

        要使用这些方法,您需要参考 Microsoft.Expression.Interactions 和 来自 C:\Program Files (x86)\Microsoft SDKs\Expression\Blend.NETFramework\v4.5\Libraries 的 System.Windows.Interactivity 二进制文件。

        【讨论】:

        • 它们是 Microsoft.Expression.Interaction (ei) 和 System.Windows.Interactivity 的 xaml 中的混合命名空间别名
        猜你喜欢
        • 2022-01-19
        • 1970-01-01
        • 2013-12-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-09
        相关资源
        最近更新 更多