UWP C#如何在不同页面上使用例程

如何解决UWP C#如何在不同页面上使用例程

我打算用navigationview编写一个UWP,在其中我使用rs485与某些设备进行通信。

我有一个DS3231 RTC,我之前已经在较早的应用程序中使它正常工作。

我的SettingPage是我配置时间的地方,当我设置时间时,我遇到了错误。 system.nullreferenceexception: 'object reference not set to an instance of an object.'

我的startClock()readDS3231setDS3231例程位于MainPage.xaml.cs中。 我的datepickertimepicker例程位于SettingsPage中。

请帮助让我知道我在哪里做错了以及如何纠正它。 实际上,我对page很困惑。我不明白。


SettingsPage.xaml.cs

private void DatePicker_DateChanged(object sender,DatePickerValueChangedEventArgs e)
    {
        DateTimeSettings.SetSystemDateTime(e.NewDate.UtcDateTime);

        mainPage.SetTime_DS3231(e.NewDate.UtcDateTime);
    }

private void TimePicker_TimeChanged(object sender,TimePickerValueChangedEventArgs e)
    {
        var currentDate = DateTime.Now.ToUniversalTime();

        var newDateTime = new DateTime(currentDate.Year,currentDate.Month,currentDate.Day,e.NewTime.Hours,e.NewTime.Minutes,e.NewTime.Seconds);

        DateTimeSettings.SetSystemDateTime(newDateTime);

        mainPage.SetTime_DS3231(newDateTime);
    }

private void TimeZoneComboBox_SelectionChanged(object sender,SelectionChangedEventArgs e)
    {
        TimeZoneInfo selectedTimeZone = (TimeZoneInfo)this.TimeZoneComboBox.SelectedItem;
        Zone.Text = selectedTimeZone.ToString();
        TimeZoneInfo.ConvertTime(DateTime.Now,selectedTimeZone);
    }

private void UpdateRTC_Click(object sender,RoutedEventArgs e)
    {
        mainPage.SetTime_DS3231(DateTime.Now);
    }

private void ReadRTC_Click(object sender,RoutedEventArgs e)
    {
        mainPage.GetTime_DS3231();

        ReadSec.Text = mainPage.readSec;
        ReadMin.Text = mainPage.readMin;
        ReadHour.Text = mainPage.readHour;
        ReadDay.Text = mainPage.readDay;
        ReadDate.Text = mainPage.readDate;
        ReadMth.Text = mainPage.readMth;
        ReadYear.Text = mainPage.readYear;
    }

MainPage.xaml.cs

public async void GetTime_DS3231()
    {
        /* DS3231 I2C SLAVE address */
        int SlaveAddress = 0x68;

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await DeviceInformation.FindAllAsync(AQS);
            }

            //rtcError = false;

            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id,Settings))
            {
                byte[] writeBuf = { 0x00 };
                Device.Write(writeBuf);
                byte[] readBuf = new byte[7];
                Device.Read(readBuf);
                byte second = bcdToDec((byte)(readBuf[0] & 0x7f));
                byte minute = bcdToDec(readBuf[1]);
                byte hour = bcdToDec((byte)(readBuf[2] & 0x3f));
                byte dayOfWeek = bcdToDec(readBuf[3]);
                byte dayOfMonth = bcdToDec(readBuf[4]);
                byte month = bcdToDec(readBuf[5]);
                byte year = bcdToDec(readBuf[6]);

                readSec = second.ToString();
                readMin = minute.ToString();
                readHour = hour.ToString();
                readDay = dayOfWeek.ToString();
                readDate = dayOfMonth.ToString();
                readMth = month.ToString();
                readYear = year.ToString();
                
                var currentDate = DateTime.Now.ToUniversalTime();

                var newDateTime = new DateTime(currentDate.Year,month,dayOfMonth,hour,minute,second);

                DateTimeSettings.SetSystemDateTime(newDateTime);

            }
        }
        catch (Exception ex)
        {
            MainStatusDisplay.Text = ex.Message;
            //System.Diagnostics.Debug.Write(ex.Message);
        }
    }

    public async void SetTime_DS3231(DateTime dt)
    {
        int SlaveAddress = 0x68;

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(AQS);
            }

            //rtcError = false;

            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id,Settings))
            {
                byte write_seconds = decToBcd((byte)dt.Second);
                byte write_minutes = decToBcd((byte)dt.Minute);
                byte write_hours = decToBcd((byte)dt.Hour);
                byte write_dayofweek = decToBcd((byte)dt.DayOfWeek);
                byte write_day = decToBcd((byte)dt.Day);
                byte write_month = decToBcd((byte)dt.Month);
                //byte write_year = decToBcd((byte)dt.Year);
                byte write_year = IntToBcd(dt.Year % 100);

                byte[] write_time = { 0x00,write_seconds,write_minutes,write_hours,write_dayofweek,write_day,write_month,write_year };

                Device.Write(write_time);

            }
        }
        catch (Exception ex)
        {
            //rtcError = true;
            MainStatusDisplay.Text = ex.Message;
            //System.Diagnostics.Debug.Write(ex.Message);
        }

    }

enter image description here

enter image description here

enter image description here

enter image description here

解决方法

必须使用SettingsPage.mainPage当前活动的页面实例初始化成员MainPage。如果不使用MVVM,事情将变得复杂而丑陋。因此,我建议引入一个在两个视图之间共享的视图模型。

还请注意,异步方法必须返回Task,否则您将遇到奇怪的行为,尤其是当等待方法引发异常时。您还忘记了await异步方法。考虑遵循最佳做法的命名约定,并将“ Async”后缀添加到异步方法,例如GetTime_DS3231Async

MainViewModel.cs

class MainViewModel : INotifyPropertyChanged
{
    public async Task GetTimeDs3231Async()
    {
        /* DS3231 I2C SLAVE address */
        int SlaveAddress = 0x68;

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await DeviceInformation.FindAllAsync(AQS);
            }

            //rtcError = false;

            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id,Settings))
            {
                byte[] writeBuf = { 0x00 };
                Device.Write(writeBuf);
                byte[] readBuf = new byte[7];
                Device.Read(readBuf);
                byte second = bcdToDec((byte)(readBuf[0] & 0x7f));
                byte minute = bcdToDec(readBuf[1]);
                byte hour = bcdToDec((byte)(readBuf[2] & 0x3f));
                byte dayOfWeek = bcdToDec(readBuf[3]);
                byte dayOfMonth = bcdToDec(readBuf[4]);
                byte month = bcdToDec(readBuf[5]);
                byte year = bcdToDec(readBuf[6]);

                readSec = second.ToString();
                readMin = minute.ToString();
                readHour = hour.ToString();
                readDay = dayOfWeek.ToString();
                readDate = dayOfMonth.ToString();
                readMth = month.ToString();
                readYear = year.ToString();
                
                var currentDate = DateTime.Now.ToUniversalTime();

                var newDateTime = new DateTime(currentDate.Year,month,dayOfMonth,hour,minute,second);

                DateTimeSettings.SetSystemDateTime(newDateTime);

            }
        }
        catch (Exception ex)
        {
            MainStatusDisplay.Text = ex.Message;
            //System.Diagnostics.Debug.Write(ex.Message);
        }
    }

    public async Task SetTimeDs3231Async(DateTime dt)
    {
        int SlaveAddress = 0x68;

        try
        {
            // Initialize I2C
            var Settings = new I2cConnectionSettings(SlaveAddress);
            Settings.BusSpeed = I2cBusSpeed.StandardMode;

            if (AQS == null || DIS == null)
            {
                AQS = I2cDevice.GetDeviceSelector("I2C1");
                DIS = await Windows.Devices.Enumeration.DeviceInformation.FindAllAsync(AQS);
            }

            //rtcError = false;

            using (I2cDevice Device = await I2cDevice.FromIdAsync(DIS[0].Id,Settings))
            {
                byte write_seconds = decToBcd((byte)dt.Second);
                byte write_minutes = decToBcd((byte)dt.Minute);
                byte write_hours = decToBcd((byte)dt.Hour);
                byte write_dayofweek = decToBcd((byte)dt.DayOfWeek);
                byte write_day = decToBcd((byte)dt.Day);
                byte write_month = decToBcd((byte)dt.Month);
                //byte write_year = decToBcd((byte)dt.Year);
                byte write_year = IntToBcd(dt.Year % 100);

                byte[] write_time = { 0x00,write_seconds,write_minutes,write_hours,write_dayofweek,write_day,write_month,write_year };

                Device.Write(write_time);

            }
        }
        catch (Exception ex)
        {
            //rtcError = true;
            MainStatusDisplay.Text = ex.Message;
            //System.Diagnostics.Debug.Write(ex.Message);
        }    
    }
}

App.xaml

<Application>
  <Application.Resources>
    <MainViewModel x:Key="MainViewModel"/>
  </Application.Resources>
</Application>

MainPage.xam

<Page DataContext="{StaticResource MainViewModel}">

</Page>

SettingsPage.xam

<Page DataContext="{StaticResource MainViewModel}">

</Page>

SettingsPage.xaml.cs

private async void DatePicker_DateChanged(object sender,DatePickerValueChangedEventArgs e)
{
    DateTimeSettings.SetSystemDateTime(e.NewDate.UtcDateTime);

    var viewModel = this.DataContext as MainViewModel;

    // Await the asynchronous method
    await viewModel.SetTimeDs3231Async(e.NewDate.UtcDateTime);
}
,

在您使用mainPage.SetTime_DS3231(newDateTime)时,变量mainPage的值为null。确保已正确初始化。 在此之前它已经初始化了吗?然后可能会在代码执行过程中的某个时候将其删除,例如在切换页面时。

您可以尝试将其放在mainPage.SetTime_DS3231(newDateTime)之前:

if(mainPage == null)
    mainPage = new MainPage();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-