gpt4 book ai didi

c# - 返回到 UWP XAML 页面 ContentDialog.RunAsync() 后导致 'Value does not fall within the expected range.'

转载 作者:行者123 更新时间:2023-12-04 10:44:09 26 4
gpt4 key购买 nike

使用 UWP 和 MVVM Light,我有一个程序使用不同的数据多次使用相同的页面和 ViewModel。每个页面/ViewModel 对都分配了一个匹配的 ID,以便它们可以更轻松地相互引用。页面上有一个按钮,显示一个 ContentDialog。

第一次打开其中一个页面时,ContentDialog 正常打开,但如果页面被留下然后返回,则为 ContentDialog 调用 ShowAsync 会导致非常具有描述性的 ArgumentException:'值不在预期范围内。'

View 模型

public RelayCommand LockButtonCommand => new RelayCommand(() => lockButtonClicked());

private void lockButtonClicked()
{
System.Diagnostics.Debug.WriteLine("Button clicked on VM " + myID);
Messenger.Default.Send(new ShowPassphraseDialogMessage(), myID);
}

页面代码隐藏
protected override void OnNavigatedTo(NavigationEventArgs e)
{
if (!idsRegistered.Contains(myID))
{
Messenger.Default.Register<ShowPassphraseDialogMessage>(this, myID, showDiag);

System.Diagnostics.Debug.WriteLine("Registered messages for " + myID);

idsRegistered.Add(myID);
}
}

private async void showDiag(object msg)
{
System.Diagnostics.Debug.WriteLine("Showing dialog for " + myID);
if (activePageID != myID)
return;
await PassphraseDialog.ShowAsync();
}

内容对话框 XAML
<ContentDialog x:Name="PassphraseDialog"
x:Uid="Page_PassDialog"
PrimaryButtonText="Enter"
SecondaryButtonText="Cancel"
PrimaryButtonCommand="{x:Bind ViewModel.PassDialogEnterCommand}"
Closing="PassphraseDialog_Closing">
<StackPanel>
<TextBlock x:Uid="Page_PassDialogText" />
<StackPanel Orientation="Horizontal" VerticalAlignment="Center">
<PasswordBox x:Name="PassphraseDialogInput"
Password="{x:Bind ViewModel.PassDialogInputText, Mode=TwoWay}"
helper:EnterKeyHelpers.EnterKeyCommand="{x:Bind ViewModel.PassDialogEnterCommand}" />
<ProgressRing Margin="8,0,0,12"
IsActive="{x:Bind ViewModel.PassDialogLoading, Mode=OneWay}" />
</StackPanel>
<TextBlock Text="{x:Bind ViewModel.PassDialogErrorText, Mode=OneWay}"
Foreground="{ThemeResource SystemErrorTextColor}"/>
</StackPanel>
</ContentDialog>

我首先担心的是,在我的设置中,showDiag 方法被多次调用。所以我做了几个测试来了解以下内容:
  • 为代码隐藏中的每个 ID 注册一次消息。
  • 消息发送一次。
  • showDiag 被调用一次。

  • 我不确定这是否相关,但我发现通过这种设置,每次导航到该页面时都会调用页面构造函数。

    最佳答案

    当您需要多次使用同一个页面时,请缓存该页面。

    尝试这个:

    private bool _isInit = false;
    public MyPage()
    {
    this.InitializeComponent();
    NavigationCacheMode = NavigationCacheMode.Enabled;
    }
    protected override void OnNavigatedTo(NavigationEventArgs e)
    {
    if (e.NavigationMode == NavigationMode.Back || _isInit)
    return;

    // Do Somethings...

    _isInit = true;
    }

    当页面被缓存时,它会维护页面的当前状态,这意味着两件事:
  • ContentDialog您创建的将不会被 ContentDialog 取代新创建的页面,导致错误。
  • 页面离开和返回时,页面不会重复创建。

  • 此致。

    关于c# - 返回到 UWP XAML 页面 ContentDialog.RunAsync() 后导致 'Value does not fall within the expected range.',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794378/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com