WPF 材料设计 小吃栏持续时间



嘿,我正在尝试弄清楚如何为零食栏腾空一个持续时间,该小吃栏附带的 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));
  1. 视图
<materialDesign:Snackbar
            Width="450"
            Margin="4"
            HorizontalAlignment="Right"
            VerticalAlignment="Bottom"
            MessageQueue="{Binding SnackbarMessageQueue}" />
  1. 上下文
public SnackbarMessageQueue SnackbarMessageQueue { set; get; } = 
        new(TimeSpan.FromSeconds(1)); // you could set a default time or not..
  1. 效用
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));
  1. 示例用法:
SnackbarMessageQueue.SnackbarEnqueue("Hi there1");
SnackbarMessageQueue.SnackbarEnqueue("Hi there2", duration: 2);
SnackbarMessageQueue.SnackbarEnqueue("Hi there3", "Click Me!", () => Console.WriteLine("Snackbar button clicked.."));
  1. 视图
<Button Content="Show SnackBar" Command={Binding ShowSnackBarCommand} />
<materialdesign:Snackbar
    IsActive="{Binding SnackBarIsActive}"
    Message="{Binding SnackBarMessage}" />
  1. 上下文
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;
    }
}

最新更新