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
。因此,当没有定义 ContentTemplate
或 ContentTemplateSelector
并且您不直接将 XAML 元素作为 Content
传递时,ContentControl
的默认行为就会启动。这会导致为对话框内容创建一个 TextBlock
元素,其中您的字符串绑定到它的 Text
属性。这正是你的图片所显示的。
因此,要获得与图片显示不同的结果,您需要直接传递要在对话框中显示的 XAML 元素(带有根容器元素和对话框所需的所有按钮)或在 XAML 中为 DialogHost
定义 DataTemplate
或 DataTemplateSelector
,如果您想在 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
});
我想在任何线程中使用 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
。因此,当没有定义 ContentTemplate
或 ContentTemplateSelector
并且您不直接将 XAML 元素作为 Content
传递时,ContentControl
的默认行为就会启动。这会导致为对话框内容创建一个 TextBlock
元素,其中您的字符串绑定到它的 Text
属性。这正是你的图片所显示的。
因此,要获得与图片显示不同的结果,您需要直接传递要在对话框中显示的 XAML 元素(带有根容器元素和对话框所需的所有按钮)或在 XAML 中为 DialogHost
定义 DataTemplate
或 DataTemplateSelector
,如果您想在 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
});