UWP中的自定义内容对话框,带有3个以上按钮

时间:2016-06-10 00:16:57

标签: c# dialog windows-10-universal

我想显示一个内容对话框,其中包含的内容超过了传统的主要和次要结果。由于我无法覆盖ContentDialogResult枚举并向该属性添加选项,因此似乎我唯一的选择可能是创建自己的自定义控件,其工作方式与ContentDialog类似。

对于其他上下文:通常,在计算机/应用程序操作期间可能会看到一个对话框,当操作是多余的时,即将文件复制到文件夹时,计算机通常会提供一个没有2个选项的对话框,但是4. - > "是全部","否全部","是","否"。我似乎找不到任何方法来利用这种看似普遍的做法 我想像普通的内容对话框一样使用它,如下所示:

var dialog = new MyCustomContentDialog();
var result = dialog.ShowAsync();

然后返回枚举,就像普通的ContentDialog一样,但它会返回4个选项中的1个,而不仅仅是2个。

任何帮助或建议都会很棒。感谢。

2 个答案:

答案 0 :(得分:19)

  

我希望显示的内容对话框超过传统的主要和辅助结果。

ContentDialog有2个内置按钮(主/辅助按钮),让用户响应对话框。如果您想让更多按钮让用户响应对话框,您应该可以通过在对话框的内容中包含这些按钮来实现此目的。

以下是一个简单的示例,演示了如何使用3按钮创建和使用自定义对话框:

<强> MyCustomContentDialog.xaml

<ContentDialog
x:Class="ContentDialogDemo01.MyCustomContentDialog"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ContentDialogDemo01"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
x:Name="dialog"
Title="Delete">

<!-- Content body -->
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}" Margin="0,20">
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition Height="200" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
        <ColumnDefinition />
        <ColumnDefinition />
        <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <TextBlock Grid.ColumnSpan="3" Text="Delete file A?" Margin="5" />
    <Button Grid.Row="1" Content="Yes" x:Name="btn1" Click="btn1_Click" Margin="5,0" Width="100" />
    <Button Grid.Row="1" Grid.Column="1" Content="No" x:Name="btn2" Click="btn2_Click" Margin="5,0" Width="100" />
    <Button Grid.Row="1" Grid.Column="2" Content="Cancle" x:Name="btn3" Click="btn3_Click" Margin="5,0" Width="100" />
</Grid>
</ContentDialog>

<强> MyCustomContentDialog.xaml.cs

namespace ContentDialogDemo01
{
// Define your own ContentDialogResult enum
public enum MyResult
{
    Yes,
    No,
    Cancle,
    Nothing
}

public sealed partial class MyCustomContentDialog : ContentDialog
{
    public MyResult Result { get; set; }

    public MyCustomContentDialog()
    {
        this.InitializeComponent();
        this.Result = MyResult.Nothing;
    }

    // Handle the button clicks from dialog
    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        this.Result = MyResult.Yes;
        // Close the dialog
        dialog.Hide();
    }

    private void btn2_Click(object sender, RoutedEventArgs e)
    {
        this.Result = MyResult.No;
        // Close the dialog
        dialog.Hide();
    }

    private void btn3_Click(object sender, RoutedEventArgs e)
    {
        this.Result = MyResult.Cancle;
        // Close the dialog
        dialog.Hide();
    }
}
}

以下是显示自定义对话框并使用返回的自定义结果的代码:

private async void ShowDialog_Click(object sender, RoutedEventArgs e)
{
    // Show the custom dialog
    MyCustomContentDialog dialog = new MyCustomContentDialog();
    await dialog.ShowAsync();

    // Use the returned custom result
    if (dialog.Result == MyResult.Yes)
    {
        DialogResult.Text = "Dialog result Yes.";
    }
    else if (dialog.Result == MyResult.Cancle)
    {
        DialogResult.Text = "Dialog result Canceled.";
    }
    else if (dialog.Result == MyResult.No)
    {
        DialogResult.Text = "Dialog result NO.";
    }
}

这是entire sample。以下是输出: enter image description here

答案 1 :(得分:1)

只是为了完整性 - ContentDialog 类默认提供三个按钮 - PrimarySecondaryClose。关闭是在用户按下退出键时触发的,但如果您设置 CloseButtonText,该按钮将显示为对话框页脚中的第三个按钮。