Warm tip: This article is reproduced from serverfault.com, please click

其他-C# Autocad UserControl WPF 从另一个类更改文本框

(其他 - C# Autocad UserControl WPF change text box from another class)

发布于 2018-10-21 21:42:28

这是一个经典的用户控件 (WPF) 文本框,需要从另一个类进行更新。这是一个 Autocad 插件。我只会展示需要的东西。

我尝试执行以下操作,但这里似乎不起作用: 从另一个类更改文本框

用户控制代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;

using AcAp = Autodesk.AutoCAD.ApplicationServices.Application;

namespace SimpleWpfPalette
{
    public partial class PaletteUserControl : UserControl
    {

        char quote = '"';

        public PaletteUserControl()
        {
            InitializeComponent();
        }

        private void processButton_Click(object sender, RoutedEventArgs e)
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            if (doc != null)
                doc.SendStringToExecute("UAIF " + quote + totalSheetsBox.Text + quote + " " + quote + originatorBox.Text + quote + " " + quote + approverBox.Text + quote +
                   " " + quote + identBox.Text + quote + " " + quote + dateBox.Text + quote + " " + quote + germanBox.Text + quote + " " + quote + weightBox.Text + quote +
                   " " + quote + drawingnbrBox.Text + quote + " " + quote + indexBox.Text + quote + " " + quote + englishBox.Text + quote + " " + quote + frenchBox.Text + quote
                   + "\n", false, false, false);
        }

        private void nameBox_TextChanged(object sender, TextChangedEventArgs e)
        {

        }

        private void M10Button_Click(object sender, RoutedEventArgs e)
        {
            var doc = AcAp.DocumentManager.MdiActiveDocument;
            if (doc != null)
                doc.SendStringToExecute("m10file" + "\n", false, false, false);
        }

        public void setidentBox (string text)
        {
           identBox.Text = text;       
        }

    }
}

基本上我想在另一个类中调用以下内容:

public void setidentBox (string text)
{
   identBox.Text = text;       
}

现在,在我要大大浓缩的课堂上,我们有以下内容:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.AutoCAD.ApplicationServices;
using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using Autodesk.AutoCAD.Windows;
using System.IO;
using System.Drawing;
using System.Windows.Forms.Integration;


namespace SimpleWpfPalette
{
    public class Commands
    {
        static CustomPalette palette;

[CommandMethod("m10file")]
        public void ReadingM10File()
        {

            Document doc =
            Application.DocumentManager.MdiActiveDocument;

            Editor ed = doc.Editor;

            string fileDirectory = "C:\\Users\\Dustin\\source\\repos\\ReadInM10File";

            string[] stringArray = new string[15];

            M10Class[] M10DataInstance = new M10Class[15];

            for (int i = 0; i < M10DataInstance.Length; i++)
            {
                M10DataInstance[i] = new M10Class();
            }

            OpenFileDialog ofd = new OpenFileDialog("Select M10 File", null, "m10", "M10FileToLink", OpenFileDialog.OpenFileDialogFlags.DefaultIsFolder);

            ofd.ShowDialog();

            var lines = File.ReadAllLines(ofd.Filename, Encoding.Default);

            int counter = 0;
            foreach (var line in lines)
            {
                M10DataInstance[counter].idNum = line.Remove(3);
                M10DataInstance[counter].dataString = line.Remove(0, 6);
                counter++;

            }

                for (int i = 0; i < M10DataInstance.Length; i++)
                {
                    ed.WriteMessage(M10DataInstance[i].idNum + " " + M10DataInstance[i].dataString);
                }

            // PaletteUserControl puc = new PaletteUserControl();

            // puc.setidentBox("test");

        }

所以你可以看到我的最后两行代码,我正在创建一个新的 PaletteUserControl 实例,我知道它不会更新我当前的实例。

基本上,我怎样才能简单地公开现有的 PaletteUserControl 以简单地允许我调用 setidentBox(string) 函数?

Questioner
Busta
Viewed
0
gileCAD 2018-10-22 14:10:05

在 CustomPalette 类中,你添加一个公共属性,该属性公开添加到调色板集中的 PaletteUserControl:

public class CustomPalette : PaletteSet
{
    private PaletteUserControl userControl;

    public PaletteUserControl PaletteUserControl => userControl;

    public CustomPalette() : base("CustomPalette")
    {
        Style = PaletteSetStyles.ShowAutoHideButton |
                PaletteSetStyles.ShowCloseButton |
                PaletteSetStyles.ShowPropertiesMenu;

        userControl = new PaletteUserControl();
        AddVisual("PaletteUserControl", userControl);
    }
}

在 PaletteUserControl 类中,你定义 SetIdentBox 方法:

public partial class PaletteUserControl : UserControl
{
    public PaletteUserControl()
    {
        InitializeComponent();
    }

    public void SetIdentBox(string text)
    {
        identBox.Text = text;
    }
}

在 Commands 类中,你可以调用palette.PaletteUserControl.SetIdentBox() 方法:

palette.PaletteUserControl.SetIdentBox("test");

无论如何,在使用 WPF 时,你应该看看 WPF 数据绑定功能。