【问题标题】:C# Snackbar as DialogC# Snackbar 作为对话框
【发布时间】:2020-11-20 00:31:10
【问题描述】:

我想在任何线程中使用 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# wpf dialog snackbar material-design-in-xaml


    【解决方案1】:

    一切似乎都适合我。

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

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

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

    【讨论】:

      【解决方案2】:

      你可以使用:

      App.Current.Dispatcher.Invoke(()=>{
      
      //Add the control related code stuff here
      
      });
      

      【讨论】:

        【解决方案3】:

        在@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");
        

        【讨论】:

        • Anateus 帮助找到了解决方案,但您没有授予赏金。不大好。您无法奖励自己的答案并获得声望点数。
        • 对不起,我不知道。下次我会奖励赏金。我没有奖励它,因为没有人为我的问题提供真正的解决方案,只有想法......
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-03-17
        • 2016-05-21
        • 1970-01-01
        • 1970-01-01
        • 2016-11-14
        • 2018-09-12
        • 2021-10-20
        相关资源
        最近更新 更多