[英]How to access MainWindow class tools from other classes in c#
我需要訪問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));
}
}
}
您應該始終將此信息傳遞給類,這是關注點分離,並確保在視圖更改時您不必更新其他類。 這也意味着可以重用其他類。
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;
}
}
var mainWindow = new MainWindow();
int a = int32.Parse(mainWindow.txt1.Text);
int b = int32.Parse(mainWindow.txt2.Text);
通過將引用傳遞給靜態屬性,此方法應使您可以訪問任何窗口中的任何內容:
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());
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.