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

时间:2016-06-10 10:44:26

标签: 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://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>

namespace MyAbsClass
{   
class manipulate
{
    public void add()
    {
       int a=int32.Parse(txt1.Text);
       int b=int32.Parse(txt2.Text);
    }
}   

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

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
    MessageBox.Show("Added value= "+(a+b));
    }
}
}

3 个答案:

答案 0 :(得分:2)

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

你也是从WPF的错误方式来解决这个问题 - 你不想从TextBox中获取值,你希望TextBox设置值。你应该使用绑定。

这是一个适合你的工作样本,我很感激它并没有直接回答你的问题,但我希望它能帮助你找到正确的方向。

查看:

<Window x:Class="WPFDynamicControls.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:WPFDynamicControls"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525" >
    <StackPanel>
        <TextBox Text="{Binding BoxA}"/>
        <TextBox Text="{Binding BoxB}"/>
        <Button Content="Add" Click="btn1_Click"/>
    </StackPanel>
</Window>

代码背后:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        this.DataContext = this;
        InitializeComponent();
    }

    public int BoxA { get; set; }

    public int BoxB { get; set; }

    private void btn1_Click(object sender, RoutedEventArgs e)
    {
        MessageBox.Show("Added value= " + Manipulate.Add(this.BoxA, this.BoxB));
    }
}

public static class Manipulate
{
    public static int Add(int a, int b)
    {
        return a + b;
    }
}

答案 1 :(得分:0)

var mainWindow = new MainWindow();
int a = int32.Parse(mainWindow.txt1.Text);
int b = int32.Parse(mainWindow.txt2.Text);

答案 2 :(得分:0)

通过将引用传递给静态属性,此方法可以让您访问任何窗口中的任何内容:

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));
    }
}

更好的清洁解决方案

您只需将BindingInterface一起使用,然后传递整个窗口:

<StackPanel>
    <TextBox Text="{Binding X}"/>
    <TextBox Text="{Binding Y}"/>
    <Button Content="Add" Click="Btn_Add"/>
</StackPanel>

实施界面:

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());
    }
}