我需要在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));
}
}
}
答案 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));
}
}
更好的清洁解决方案
您只需将Binding与Interface一起使用,然后传递整个窗口:
<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());
}
}