WinUI3開發筆記(Ⅱ)

  • WinUI3中的”MessageBox.Show()

# (一,如何實現)

“開發WinUI3,第一個不適就是消息彈窗!”

WinUI中沒有C#.NetFrameWork的MessageBox,但怎麼實現彈窗呢?官方給出了方法

官方給出了示例程式碼,可在應用商店搜索”Xaml Controls Gallery”或前往官網-開發人員中心-查看示例可以下載示例(包括源程式碼)

image

點擊查看xaml程式碼
<Page
    x:Class="AppUIBasics.ControlPages.ContentDialogContent"
    xmlns="//schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="//schemas.microsoft.com/winfx/2006/xaml">

    <StackPanel VerticalAlignment="Stretch" HorizontalAlignment="Stretch">
        <!-- Content body -->
        <TextBlock Text="Lorem ipsum dolor sit amet, adipisicing elit." TextWrapping="Wrap" />
        <CheckBox Content="Upload your content to the cloud."/>
    </StackPanel>

</Page>
點擊查看C#程式碼
private async void ShowDialog_Click(object sender, RoutedEventArgs e)
{
    ContentDialog dialog = new ContentDialog();
    dialog.Title = "Save your work?";
    dialog.PrimaryButtonText = "Save";
    dialog.SecondaryButtonText = "Don't Save";
    dialog.CloseButtonText = "Cancel";
    dialog.DefaultButton = ContentDialogButton.Primary;
    dialog.Content = new ContentDialogContent();

    var result = await dialog.ShowAsync();
}

C#程式碼是放置在事件中的,比如按鈕點擊時彈窗,則放入這一段,其中倒數第二條dialog.Content = new ContentDialogContent(); 則是連接的另一個xaml頁面作為內容,去掉也可以的

效果如下:
image

當然,也可以放置其他內容,比如顏色選擇,圖片剪輯等,此處就不過多展示(因為顏色選擇器本人還未弄懂)


(二,報錯問題)

當我興高采烈放到一個”Test”項目中嘗試的時候,出錯啦!

為什麼出錯呢?直接運行會直接導致閃退,使用調試的時候,看到了以下錯誤:
image
System.ArgumentException:「Value does not fall within the expected range.」
也就是值不在預期範圍內,超範圍了唄!
後來經過幾個小時的不斷嘗試,我發現…

來自//blog.csdn.net/flyingdream123/article/details/122523347的部落客給出了問題所在
image

也就是在var result = await dialog.ShowAsync();的前面需設置XamlRoot

點擊查看程式碼
if (ApiInformation.IsApiContractPresent("Windows.Foundation.UniversalApiContract", 8))
            {
                dialog.XamlRoot = this.Content.XamlRoot;
            }

折騰了好久的問題終於解決了!官方竟然沒給出這一段…[無語]😶


(三,獲取點擊的按鈕)

如何判斷用戶點擊了哪個按鈕呢?
var result = await dialog.ShowAsync();則是獲取了按鈕值,判斷方法如下:
image

點擊查看程式碼
if (result == ContentDialogResult.Primary)
{
    //第一按鈕"
}
else if (result == ContentDialogResult.Secondary)
{
    //第二按鈕"
}
else
{
    //取消按鈕
}

注意!前面的C#程式碼中設置按鈕的片段中,取消按鈕是必須的,其餘按鈕是可選的


特別說明:彈窗需要使用非同步方法!

image

Tags: