1

I am working on a reusable content dialog UserControl that the user can import into their xaml and only have to be responsible for bindings in their respective ViewModel. My UserControl has DependencyProperties tied to appropriate content, but the Content Dialog event's are not visible (programmatically) to users of the UserControl. Specifically, I am looking for .ShowAsync()., but Intellisense does not see .ShowAsync() as being part of UserControl.

I used the examples here as a pattern, but I don't need to extend the DialogContent class for my purpose (I think?): https://learn.microsoft.com/en-us/uwp/api/Windows.UI.Xaml.Controls.ContentDialog

As an experiment, I tried to make this SO work, but I then realized this was sitting on Template 10 framework and Dependency Injection/IoC (I am doing my app in straight C#): UWP ContentDialog Invocation

Here is my UserControl's code behind:

public partial class UserDefinedDialogView : UserControl
   {
      public static readonly DependencyProperty TitleProperty =
         DependencyProperty.Register("DialogTitle", typeof(string), typeof(UserDefinedDialogView), null);

      public static readonly DependencyProperty DialogContentTextProperty =
         DependencyProperty.Register("DialogContent", typeof(string), typeof(UserDefinedDialogView), null);

      public static readonly DependencyProperty PrimaryButtonTextProperty =
         DependencyProperty.Register("DialogPrimaryButtonText", typeof(string), typeof(UserDefinedDialogView), null);

      public static readonly DependencyProperty SecondaryButtonTextProperty =
         DependencyProperty.Register("DialogSecondaryButtonText", typeof(string), typeof(UserDefinedDialogView), null);

      public static readonly DependencyProperty CloseButtonTextProperty =
         DependencyProperty.Register("DialogCloseButtonText", typeof(string), typeof(UserDefinedDialogView), null);


      // PropertyWrappers
      public string DialogTitle
      {
         get { return (string)GetValue(TitleProperty); }
         set { SetValue(TitleProperty, value); }
      }

      public string DialogContent
      {
         get { return (string)GetValue(DialogContentTextProperty); }
         set { SetValue(DialogContentTextProperty, value); }
      }

      public string DialogPrimaryButtonText
      {
         get { return (string)GetValue(PrimaryButtonTextProperty); }
         set { SetValue(PrimaryButtonTextProperty, value); }
      }

      public string DialogSecondaryButtonText
      {
         get { return (string)GetValue(SecondaryButtonTextProperty); }
         set { SetValue(SecondaryButtonTextProperty, value); }
      }

      public string DialogCloseButtonText
      {
         get { return (string)GetValue(CloseButtonTextProperty); }
         set { SetValue(CloseButtonTextProperty, value); }
      }

      public UserDefinedDialogView()
      {
         this.InitializeComponent();
      }
   }

The UserControl's xaml:

<UserControl
   x:Class="HHPM_NEXT.Views.Common.UserDefinedDialogView"
   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
   xmlns:local="using:HHPM_NEXT.Views.Common"
   xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
   xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
   mc:Ignorable="d"
   d:DesignHeight="300"
   d:DesignWidth="400">

      <ContentDialog x:Name="UserDefinedDialog"
         Title="{x:Bind DialogTitle, Mode=TwoWay}"
         Content="{x:Bind DialogContent, Mode=TwoWay}"
         PrimaryButtonText="{x:Bind DialogPrimaryButtonText, Mode=TwoWay}"
         CloseButtonText="{x:Bind DialogCloseButtonText, Mode=TwoWay}"
         x:FieldModifier="Public">

      </ContentDialog>
</UserControl>

Example Implementation (References to Zeroize are in a ViewModel, but I didn't add it because I didn't want this to get too long):

<views1:UserDefinedDialogView x:Name="ConfimationDialog" DialogTitle="{Binding ZeroizeTitle, Mode=TwoWay}" DialogContent="{Binding ZeroizeContent, Mode=TwoWay}"
               DialogPrimaryButtonText="{Binding ZeroizeConfirmButtonText, Mode=TwoWay}" DialogCloseButtonText="{Binding ZeroizeCloseButtonText, Mode=TwoWay}"/>
Jeffrey M
  • 133
  • 14
  • Do you mean when you run the application, the ContentDialog didn't display? If yes, you can subscribe a **this.Load** event in your UserControl and call `UserDefinedDialog.ShowAsync()` in the event. If not, can you describe in detail the issue you encountered? – Faywang - MSFT Sep 10 '19 at 01:56
  • @Faywang-MSFT The best way to describe the problem: I have no visibility (programmatically) to things like .ShowAsync(). It seems like the new UserControl lost content of ContentDialog beyond the DependencyProperties. – Jeffrey M Sep 10 '19 at 11:21
  • "Specifically, I am looking for .ShowAsync()., but Intellisense does not see .ShowAsync() as being part of UserControl." Does this means you want to show contentDialog by UserControl.ShowAsync();? About the custom ContentDialog, you can refer to this [thread](https://stackoverflow.com/questions/37738128/custom-content-dialog-in-uwp-with-3-buttons). – Faywang - MSFT Sep 11 '19 at 08:36

0 Answers0