首页 > 解决方案 > C# Snackbar 作为对话框

问题描述

我想从任何线程中使用 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)
{         
}

当前消息的显示真的很奇怪

当前的

标签: c#wpfdialogsnackbarmaterial-design-in-xaml

解决方案


一切似乎都适合我。

在您的ShowDialog()方法中,您只传递一个字符串"test"作为您的内容,DialogHost并且您没有定义 a DataTemplateinDialogHost.DialogContentTemplate或 a DataTemplateSelectorin DialogHost.DialogContentTemplateSelector。因此ContentControl,当没有ContentTemplateContentTemplateSelector未定义并且您不直接将 XAML 元素传递为Content. 这导致TextBlock为您的字符串绑定到其Text属性的对话框内容创建一个元素。这正是你的照片所显示的。

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

如果您需要提示如何实现此功能,请查看 repo 中的此示例。


推荐阅读