如何在 UWP 应用程序 C# 中将值从 ContentDialog 传递到页面?

How to pass value from ContentDialog to Page in UWP app C#?

我想实现一个简单的 ContentDialog,它有一个采用用户名的 TextBox。如何将该值传递给 UWP 中的页面??

就您的代码而言,ContentDialog 只是一个 class。 class 可以有属性。

因此您可以在显示对话框之前设置这些属性。并在对话框关闭后读取它们。

因此,您需要向从该文本框填充的 ContentDialog 添加一个 属性 - 如果您正确设置了数据绑定,则可以“自动”执行此操作。

编辑
所以而不是像

if (await new MyDialog().ShowAsync() == DialogResult.Primary) ...

做类似的事情

// first create an instance (this doesn't show anything yet)
var myDialog = new MyDialog();

// optionally set some properties
myDialog.Username = "some default value";

// now show that dialog
var res = await myDialog.ShowAsync();

// and when it is closed again ...
if (res == DialogResult.Primary)
{
   // read the properties of your dialog instance
   var theUsername = myDialog.Username;
   // and do something with 'theUsername' ...
}

并在该对话框的 XAML 中,将用户名 属性 绑定到文本框的文本(这是确保 属性 的值为使用文本框的最新状态更新)。

How to pass value from ContentDialog to Page in UWP app C#?

正如 Hans Kesting 所说,您可以设置对话框的属性并在页面中使用对话框实例加载它。我将提供一种绑定方式来将值从 ContentDialog 传递到 Page。

public sealed partial class LoginDialog : ContentDialog ,INotifyPropertyChanged
{
    public LoginDialog()
    {
        this.InitializeComponent();
    }

    private string _username;
    private string _password;

    public string UserNameValue { get { return _username; } set { _username = value; OnPropertyChanged(); } }


    public string PasswordValue { get { return _password; } set { _password = value; OnPropertyChanged(); } }

    public event PropertyChangedEventHandler PropertyChanged;
    public void OnPropertyChanged([CallerMemberName] string name = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
    }


    private void ContentDialog_PrimaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
    {
    }

    private void ContentDialog_SecondaryButtonClick(ContentDialog sender, ContentDialogButtonClickEventArgs args)
    {
    }
}

Xaml代码

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>
    <TextBox
        x:Name="UserName"
        Grid.Row="0"
        Margin="0,0,0,12"
        Text="{x:Bind UserNameValue, Mode=TwoWay}" />
    <TextBox
        x:Name="Password"
        Grid.Row="1"
        Text="{x:Bind PasswordValue, Mode=TwoWay}" />
</Grid>

用法

var dialog = new LoginDialog();
var res = await dialog.ShowAsync();
if (res == ContentDialogResult.Primary)
{
    var password = dialog.PasswordValue;
    var userName = dialog.UserNameValue;
}