单击时Wpf切换按钮内容

时间:2012-04-04 03:10:29

标签: c# .net wpf windows

我想更改按钮内容取决于之前的内容舔如果它的添加它应该在保存中更改,如果它保存然后它应该更改为添加。我知道如何更改按钮的内容,但如何阅读要更改的内容。

5 个答案:

答案 0 :(得分:12)

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

<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更改属性,绑定可以处理所有事情。

答案 1 :(得分:7)

我同意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。

答案 2 :(得分:6)

将最终点击的值存储在该按钮的tag属性中,并在点击时检查其值。

标签说明

  

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

MSDN Link

OR

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";    
    }
}

答案 3 :(得分:3)

如果您创建了2个按钮AddButtonSaveButton,并且分别显示或隐藏它们(使用Visibility属性)

,您的应用程序会更好设计

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

答案 4 :(得分:3)

您还可以使用带有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>

如果您不想沿着那条路走下去,那么您可以将其添加到您的Checked Triggers:

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

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