0

我是 WPF 新手,想构建一个应用程序,它将与我的驱动程序进行串行通信,并且我可以从程序中为驱动程序设置值。

我已经设法制作了一个如图所示的UI。如果我最后按箭头所指的蓝色视图,我的窗口视图是这样的。如果我按下红色视图选项,那么显示就像这个 设置按钮是箭头指向右上角(窗口关闭按钮下方)的位置,按下时我的窗口将如下所示

基本上我正在根据我按下的按钮更改BIG RECTANGLE内容(例如,单击蓝色视图时矩形为蓝色,矩形填充红色和一个标签,单击红色视图时更改标签的按钮)

所以现在我的问题是,在我更改了这个 BIG RECTANGLE 的内容后,无法保留我在这个BIG RECTANGLE中设置的值。例如,当我按下设置按钮并像这样更改设置时,我已准备好在 COM5 中进行通信,并且可以按下关闭端口的选项。现在在关闭端口之前,如果我通过按下红色视图或蓝色视图来更改BIG RECTANGLE的视图,然后在按下设置按钮之后,我就没有关闭端口的选项了,因为我之前已经打开了 com5 端口所以当我尝试打开端口时,它也会给我错误。

请帮我解决一下这个。我的 Visual Studio 解决方案资源管理器看起来像这样,我在按钮单击事件中的代码如下:

 public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void SerialPortOnOFFButton_Clicked(object sender, RoutedEventArgs e)
        {
            MessageBox.Show("ON OFF Clicked");
        }

        private void SerialPortSettingButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new SerialPortSettingView();
           
        }

        private void RedViewButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new Redview();
        }

        private void BlueViewButton_Clicked(object sender, RoutedEventArgs e)
        {
            DataContext = new Blueview();
        }
    }

我的解决方案资源管理器看起来像这样

4

2 回答 2

1

如果你只想关闭你的端口,你可以像这样在你的类中实现IDisposable接口。SerialPortSettingView每次您DataContextSerialPortSettingView您的端口​​更改时都会关闭。

public class SerialPortSettingView : IDisposable
{
    private FileStream _fileStream;

    public SerialPortSettingView()
    {
        _fileStream = new FileStream("somefile.txt", FileMode.Open);
    }

    public void Dispose()
    {
        _fileStream?.Close();
    }
}
于 2018-11-09T13:09:24.187 回答
0

每次更改视图时,您都在创建一个新对象以将 DataContext 设置为,如果您将各个对象保留为私有字段,则可以简单地将 DataContext 设置为这些:

    private SerialPortSettingView _serialPortSettingView;
    private RedView _redView;
    private BlueView _blueView;

    public MainWindow()
    {
        _serialPortSettingView = new SerialPortSettingView();
        _redView = new RedView();
        _blueView = new BlueView();
        InitializeComponent();
    }

    private void SerialPortOnOFFButton_Clicked(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("ON OFF Clicked");
    }

    private void SerialPortSettingButton_Clicked(object sender, RoutedEventArgs e)
    {
        DataContext = _serialPortSettingView;
    }

    private void RedViewButton_Clicked(object sender, RoutedEventArgs e)
    {
        DataContext = _redview;
    }

    private void BlueViewButton_Clicked(object sender, RoutedEventArgs e)
    {
        DataContext = _blueview;
    }

这样,当您在视图之间切换时,您将使用存储的版本,而当您更改值时,它们将存储在该视图中。

如果我正在执行此解决方案,我会将 ContentControl 更改为 TabControl(隐藏标题),然后创建每个 View,以及随附的 ViewModel,作为选项卡。然后在触发每个单击事件时,您只需设置 TabControl 的 .SelectedIndex 属性。我会创建一个 MainWindowViewModel 并在构造函数中将 MainWindow 的 DataContext 设置为此:

    private MainWindowViewModel = new MainWindowViewModel();

    public MainWindow()
    {
        DataContext = _mainWindowViewModel;
    }

并将所有逻辑放在 MainWindowViewModel 中(您需要使用命令)。使用背后的代码并不是 WPF 的本意,您可以在此处阅读所有内容,并提供一个很好的教程 - MVVM 教程

我不想让事情变得过于复杂,并且一次性给你提供太多信息,但是如果你开始以这种方式做事会更好,希望这会有所帮助。

于 2018-11-09T12:57:16.860 回答