基于上次单击更改按钮内容和文本
本文关键字:按钮 文本 单击 | 更新日期: 2023-09-27 18:30:07
我想根据之前的内容点击来更改按钮内容。例如,如果它的Add
,那么它应该变为Save
,如果它是Save
,那么它就应该变回Add
。
我知道如何更改按钮的内容。但是,一个如何阅读内容来做出改变呢?
如果使用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更改属性,并通过绑定处理所有内容。
将上次单击的值存储在该按钮的标记属性中,并在单击时检查其值。
标签描述
获取或设置可用于存储有关此元素的自定义信息的任意对象值。
MSDN链接
或
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";
}
}
我同意Surfens的回答,这里的问题不是ToggleButton
的完美例子,因为"保存"answers"添加"操作非常不同,每个操作都应该在各自的按钮上设置自己的"ICommand"。
但这里有一些样式将根据ToggleButton的IsChecked
值更改内容。
如果未选中该按钮,则内容将为"ValueForUnToggledState",如果选中,则更改为"ValueforToggleyState"。
<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。
另一种设计可以是,如果创建了两个按钮,如AddButton
和SaveButton
,则可以分别显示或隐藏它们(使用Visibility
属性)。
为什么?
因为这是一个关注点分离的问题。例如,在单击处理程序中,您不需要检查所处的模式,因为您将有单独的处理程序。您还希望按钮具有不同的图标、不同的工具提示等。
您还可以使用带有EventTriggers的ToggleButton来执行选中和未选中状态的不同方法。
<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.交互二进制文件