嘿,我正在尝试弄清楚如何为零食栏腾空一个持续时间,该小吃栏附带的 ButchersBoy Material Design In Xaml 工具包在这里和这里找到。
没有任何地方说明我是否可以使用持续时间,所以也许我只是在代码中查看它?一定有一个参数允许这样做吗?
我当前的代码是这样的(代码隐藏):
items.Snackbar.MessageQueue.Enqueue("Wow, easy!")
和 XAML:
<materialDesign:Snackbar
HorizontalAlignment="Stretch"
MessageQueue="{materialDesign:MessageQueue}"
x:Name="Snackbar"
Grid.Row="1"
Grid.ColumnSpan="2" />
这确实有效并显示"哇,容易!"但它消失得太快了,所以这就是为什么我试图找到一种方法来做一个持续时间。
SnackbarMessageQueue 具有以下构造函数:
public SnackbarMessageQueue(TimeSpan messageDuration)
因此,您可以在视图模型中创建消息队列并分配,例如:
<materialDesign:Snackbar MessageQueue="{Binding MyCustomMessageQueue}" />
或者,使用代码隐藏,将控件命名为:
<materialDesign:Snackbar x:Name="MySnackbar" />
然后在代码隐藏中,您可以分配一个新的小吃栏:
var myMessageQueue = new SnackbarMessageQueue(TimeSpan.FromMilliseconds(8000));
MySnackbar.MessageQueue = myMessageQueue;
将来我们可以将其添加到您的示例中使用的标记扩展中,请随时在 GitHub 上为此提出请求。
下面是在 Xaml 工具包中为材料设计的 Snackbar 添加持续时间的另一种方法。
XAML:
<materialDesign:Snackbar
IsActive="False"
x:Name="SnackbarOne"
MessageQueue="{materialDesign:MessageQueue}"/>
代码隐藏:
SnackbarOne.MessageQueue?.Enqueue("Wow, easy!", null, null, null, false, true, TimeSpan.FromSeconds(3));
- 视图
<materialDesign:Snackbar
Width="450"
Margin="4"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
MessageQueue="{Binding SnackbarMessageQueue}" />
- 上下文
public SnackbarMessageQueue SnackbarMessageQueue { set; get; } =
new(TimeSpan.FromSeconds(1)); // you could set a default time or not..
- 效用
public static void SnackbarEnqueue(this SnackbarMessageQueue snackbarMsgQueue,
string msg, string btnContent = "", Action btnAction = null, double duration = 1) =>
snackbarMsgQueue.Enqueue(msg,
btnContent,
_ => btnAction?.Invoke(), actionArgument:null,
promote:false, neverConsiderToBeDuplicate:false,
durationOverride:TimeSpan.FromSeconds(duration));
- 示例用法:
SnackbarMessageQueue.SnackbarEnqueue("Hi there1");
SnackbarMessageQueue.SnackbarEnqueue("Hi there2", duration: 2);
SnackbarMessageQueue.SnackbarEnqueue("Hi there3", "Click Me!", () => Console.WriteLine("Snackbar button clicked.."));
- 视图
<Button Content="Show SnackBar" Command={Binding ShowSnackBarCommand} />
<materialdesign:Snackbar
IsActive="{Binding SnackBarIsActive}"
Message="{Binding SnackBarMessage}" />
- 上下文
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace SnackbarTesting
{
public partial class MainViewModel : ObservableRecipient
{
[RelayCommand]
private async Task ShowSnackBar()
{
SnackBarMessage = "TEST MESSAGE WITH DELAY!";
SnackBarIsActive = true;
await Task.Delay(TimeSpan.FromSeconds(3));
SnackBarIsActive = false;
}
[ObservableProperty]
private bool snackBarIsActive;
[ObservableProperty]
private string snackBarMessage = string.Empty;
}
}