【问题标题】:Create user control for Message Dialog为消息对话框创建用户控件
【发布时间】:2013-02-27 07:22:51
【问题描述】:

我想为消息对话框创建一个用户控件,以便根据需要更改消息对话框的 UI。例如,如果我传递标题、消息和类型,那么根据消息的类型,它应该显示该消息对话框。 类型可以是:错误、警告、简单消息等。我该如何实现呢? 当类型设置为错误示例时,自定义消息对话框的 UI 应如下所示:

【问题讨论】:

    标签: c# xaml windows-8 user-controls winrt-xaml


    【解决方案1】:

    这比你想象的要难得多。挑战在于确保对话框保持异步并将其放入可视化树中。 Gope 已经提到了 Callisto 框架中的 CustomDialog,但我发现这是非常有限的。相反,我关注了这篇非常棒的文章,它向您展示了如何制作一个可用于显示任何用户控件的通用对话框:

    为您的 Win8 应用创建自定义异步对话框 http://www.visuallylocated.com/post/2012/11/12/Creating-a-custom-async-dialog-for-your-Win8-apps-Part-2-CustomDialog.aspx

    开发支持、设计支持和更多精彩即将推出:http://bit.ly/winappsupport

    【讨论】:

    • 这个很棒的对话还有一个Nuget pack!安装包“AsyncDialogs”
    【解决方案2】:

    还有一个示例实现 here 使用 Awaitable UI 方法(使用 async/await 关键字等待 UI 事件)。

    【讨论】:

      【解决方案3】:

      天哪,你问的太多了!

      :)

      好吧,就这样吧,我会指导你,你尽自己的一份力:

      创建一个类 SysDialog : HtmlGenericControl

      public SysDialog() {
       TagName = 'div';
      }
      
      public string Title {get;set;}
      public string Message {get;set;}
      public string MessageType {get;set;}
      
      public SysDialog Render(){ 
      
      HtmlGenericControl title = new HtmlGenericControl ();
      title.TagName = "div";
      HtmlGenericControl msg = new HtmlGenericControl ();
      msg.TagName = "div";
      
      title.InnerHTML = Title;
      msg.InnerHTML = Message;
      Controls.Add(title);
      Controls.Add(msg);
      title.Attritbues.Add("class", "title-" + MessageType);
      msg.Attritbues.Add("class", "msg-" + MessageType);
      Attritbues.Add("class", "sysdlg-" + MessageType);
      return this;
      }
      

      这只是起点,您修改此代码并增强您的消息类型,并根据您的消息类型设置尽可能多的 div/按钮或其他内容。

      【讨论】:

      • 虽然我喜欢将 CSS 类和类型结合起来的想法,但我相信问题是关于 C#/XAML 而不是 HTML/Javascript……不过,很聪明! :)
      • (doh) 但他从来没有提到 XAML 的东西,而是标签。不管怎样,谢谢你喜欢这个主意(无聊)
      【解决方案4】:

      首先,您应该查看 Callisto 及其 CustomDialog (http://bit.ly/ILTyRn)。不幸的是,它仍然是一个密封类,因此您可以使用它的代码或为对话框类型定义一个 AttachedProperty。除此之外,您只需要 3 个不同的模板和一个正在检查 DialogTypeProperty 的 TemplateSelector(您需要创建这样的属性 - AttachedProp f.e.)

      希望这能为您指明正确的方向。 :)

      【讨论】: