C# Snackbar 作为对话框

C# Snackbar as Dialog

我想在任何线程中使用 Snackbar。我应该像她一样声明我的 Snackbar; https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/wiki/Snackbar Wiki 说我只能从 Dispatcher 线程访问 Snackbar,但是我该如何实现呢?

用户控件xaml;

<materialDesign:DialogHost SnackbarMessageQueue="{Binding ElementName=MySnackbar, Path=MessageQueue}" Identifier="DialogSnackbar">
    <Grid>
        <!-- app content here -->
        <materialDesign:Snackbar x:Name="MySnackbar" MessageQueue="{materialDesign:MessageQueue}" />
    </Grid>
</materialDesign:DialogHost>

显示对话框,但我也想传递消息; 来自 https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/wiki/Dialogs

的实施
public static async void ShowDialog()
{
    var result = await DialogHost.Show("test", "DialogSnackbar", ExtendedOpenedEventHandler, ExtendedClosingEventHandler);
}

private static void ExtendedOpenedEventHandler(object sender, DialogOpenedEventArgs eventargs)
{
}         

private static void ExtendedClosingEventHandler(object sender, DialogClosingEventArgs eventArgs)
{         
}

当前消息显示的很奇怪

一切似乎都适合我。

在您的 ShowDialog() 方法中,您只传递一个字符串 "test" 作为 DialogHost 的内容,而您没有在 DialogHost.DialogContentTemplate 中定义 DataTemplate DialogHost.DialogContentTemplateSelector 中也没有 DataTemplateSelector。因此,当没有定义 ContentTemplateContentTemplateSelector 并且您不直接将 XAML 元素作为 Content 传递时,ContentControl 的默认行为就会启动。这会导致为对话框内容创建一个 TextBlock 元素,其中您的字符串绑定到它的 Text 属性。这正是你的图片所显示的。

因此,要获得与图片显示不同的结果,您需要直接传递要在对话框中显示的 XAML 元素(带有根容器元素和对话框所需的所有按钮)或在 XAML 中为 DialogHost 定义 DataTemplateDataTemplateSelector,如果您想在 MVVM 场景中使用它。

如果您需要如何实现它的提示,请查看存储库中的 example

在@Anateus 的帮助下,我找到了这个解决方案;

在我的 MainWindow.xaml 中我声明了这个;

<materialDesign:DialogHost  VerticalAlignment="Bottom"
                            HorizontalAlignment="Center"
                            Identifier="DialogSnackbar">
</materialDesign:DialogHost>

DialogSnackbarView.xaml-对话框的内容;

<UserControl ...>
    <Grid>
        <materialDesign:Snackbar x:Name="MySnackbar"
                                 MessageQueue="{materialDesign:MessageQueue}" />
    </Grid>
</UserControl>

到处显示对话框;

var view = new DialogSnackbarView();
view.MySnackbar.MessageQueue.Enqueue("test");
await DialogHost.Show(view, "DialogSnackbar");

您可以使用:

App.Current.Dispatcher.Invoke(()=>{

//Add the control related code stuff here

});