C# 如何从c中的其他类访问MainWindow类工具#

C# 如何从c中的其他类访问MainWindow类工具#,c#,wpf,C#,Wpf,我需要访问wpf中其他c#类(不仅仅是MainWindow类)的文本框和标签控件。 我使用了x:FieldModifier=“public”,但仍然是负数。 是否可以为其他类填充MainWindow类工具? 下面是我的简化示例代码: <Window x:Class="MyAbsClass.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://

我需要访问wpf中其他c#类(不仅仅是MainWindow类)的文本框和标签控件。 我使用了x:FieldModifier=“public”,但仍然是负数。 是否可以为其他类填充MainWindow类工具? 下面是我的简化示例代码:

<Window x:Class="MyAbsClass.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:MyAbsClass"
    mc:Ignorable="d"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <TextBox x:FieldModifier="public" x:Name="txt1"/>
    <TextBox x:FieldModifier="public" x:Name="txt2"/>
    <Button x:FieldModifier="public" x:Name="btn1" Content="Button" Click="btn1_Click"/>
</Grid>

您应该始终将此信息传递给类,这是关注点的分离,并确保在视图更改时不必更新其他类。这也意味着可以重用其他类

您也从WPF的错误方式遇到了这个问题-您不希望从TextBox获取值,而是希望TextBox设置值。您应该为此使用绑定

这是给你的一个工作样本,我很感激它不能直接回答你的问题,但我希望它能帮助你朝着正确的方向前进

视图:


您应该始终将此信息传递给类,这是关注点的分离,并确保在视图更改时不必更新其他类。这也意味着可以重用其他类

您也从WPF的错误方式遇到了这个问题-您不希望从TextBox获取值,而是希望TextBox设置值。您应该为此使用绑定

这是给你的一个工作样本,我很感激它不能直接回答你的问题,但我希望它能帮助你朝着正确的方向前进

视图:


通过传递对静态属性的引用,此方法应允许您访问任何窗口中的任何内容:

public partial class MainWindow : Window
{
    public static TextBox txt1Mirror;
    public static TextBox txt2Mirror;

    public MainWindow()
    {
        InitializeComponent();
        txt1Mirror = txt1;
        txt1Mirror = txt2;
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        Manipulate.Add();
    }
}

public static class Manipulate
{
    public static void Add()
    {
       int a = int32.Parse(MainWindow.txt1Mirror.Text);
       int b = int32.Parse(MainWindow.txt2Mirror.Text);

       MessageBox.Show("Added value= " + (a + b));
    }
}
更好更干净的解决方案

您可以简单地使用,然后传递整个窗口:

<StackPanel>
    <TextBox Text="{Binding X}"/>
    <TextBox Text="{Binding Y}"/>
    <Button Content="Add" Click="Btn_Add"/>
</StackPanel>
设置您的窗口:

public partial class MainWindow : Window, IManipulate
{
    public int X { get; set; }
    public int Y { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Add(object sender, RoutedEventArgs e)
    {
        Manipulate.Add(this);
    }
}

public static class Manipulate
{
    public static void Add(IManipulate e)
    {
       MessageBox.Show("Added value= " + (e.X + e.Y).toString());
    }
}

通过传递对静态属性的引用,此方法应允许您访问任何窗口中的任何内容:

public partial class MainWindow : Window
{
    public static TextBox txt1Mirror;
    public static TextBox txt2Mirror;

    public MainWindow()
    {
        InitializeComponent();
        txt1Mirror = txt1;
        txt1Mirror = txt2;
    }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        Manipulate.Add();
    }
}

public static class Manipulate
{
    public static void Add()
    {
       int a = int32.Parse(MainWindow.txt1Mirror.Text);
       int b = int32.Parse(MainWindow.txt2Mirror.Text);

       MessageBox.Show("Added value= " + (a + b));
    }
}
更好更干净的解决方案

您可以简单地使用,然后传递整个窗口:

<StackPanel>
    <TextBox Text="{Binding X}"/>
    <TextBox Text="{Binding Y}"/>
    <Button Content="Add" Click="Btn_Add"/>
</StackPanel>
设置您的窗口:

public partial class MainWindow : Window, IManipulate
{
    public int X { get; set; }
    public int Y { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Add(object sender, RoutedEventArgs e)
    {
        Manipulate.Add(this);
    }
}

public static class Manipulate
{
    public static void Add(IManipulate e)
    {
       MessageBox.Show("Added value= " + (e.X + e.Y).toString());
    }
}

虽然这段代码可能会解决问题,但它会从解释中受益。虽然这段代码可能会解决问题,但它会从解释中受益。
interface IManipulate
{
   int X { get; set; }
   int Y { get; set; }
}
public partial class MainWindow : Window, IManipulate
{
    public int X { get; set; }
    public int Y { get; set; }

    public MainWindow()
    {
        InitializeComponent();
    }

    private void btn_Add(object sender, RoutedEventArgs e)
    {
        Manipulate.Add(this);
    }
}

public static class Manipulate
{
    public static void Add(IManipulate e)
    {
       MessageBox.Show("Added value= " + (e.X + e.Y).toString());
    }
}