如何从另一个类或窗口访问 WPF 中的控件

问题描述 投票:0回答:9

我想访问 WPF 中 mainWindow 中的按钮或文本框等控件,但我无法执行此操作。

在 Windows 窗体应用程序中,这非常简单,您可以将该控件的修饰符设置为 True,并且可以从该 mainWindow 的实例访问该控件,但在 WPF 中我无法声明公共控件。我该怎么做?

c# wpf silverlight
9个回答
39
投票

要访问其他 WPF 表单中的控件,您必须将该控件声明为公共。 WPF 中控件的默认声明是 public,但您可以使用以下代码指定它:

<TextBox x:Name="textBox1" x:FieldModifier="public" />

之后,您可以在应用程序中的所有活动窗口中搜索,以查找具有如下控制权的窗口:

foreach (Window window in Application.Current.Windows)
{
    if (window is Window1)
    {
        ((Window1)window).textBox1.Text = "I changed it from another window";
    }
}
 

6
投票

不幸的是,WPF 的基础是数据绑定。以任何其他方式执行此操作都是“违背常规”,是不好的做法,并且通常编码和理解起来要复杂几个数量级。

对于您当前的问题,如果您有数据要在视图之间共享(即使只有一个视图),请创建一个视图模型类,其中包含表示数据的属性,并绑定到视图中的属性。

在您的代码中,仅管理您的视图模型类,并且不要触摸实际视图及其视觉控件和视觉组合。


5
投票

我发现在 WPF 中,你必须将 Window 转换为 MainWindow。

看起来很复杂,但非常简单! 但是,也许不是最佳实践。

假设我们在主窗口中有一个 Label1、一个 Button1,并且您有一个处理与称为 UI 的用户界面相关的任何内容的类。

我们可以有以下内容:

主窗口类:

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        UI ui = null;
        //Here, "null" prevents an automatic instantiation of the class,
        //which may raise a Stack Overflow Exception or not.
        //If you're creating controls such as TextBoxes, Labels, Buttons... 

        public MainWindow()
        {
            InitializeComponent(); //This starts all controls created with the XAML Designer.
            ui = new UI(); //Now we can safely create an instantiation of our UI class.
            ui.Start();
        }


    }
}

UI 类:

namespace WpfApplication1
{    
public class UI
    {
        MainWindow Form = Application.Current.Windows[0] as MainWindow;
        //Bear in mind the array! Ensure it's the correct Window you're trying to catch.

        public void Start()
        {
            Form.Label1.Content = "Yay! You made it!";
            Form.Top = 0;
            Form.Button1.Width = 50;
            //Et voilá! You have now access to the MainWindow and all it's controls
            //from a separate class/file!
            CreateLabel(text, count); //Creating a control to be added to "Form".
        }

        private void CreateLabel(string Text, int Count)
        {
            Label aLabel = new Label();
            aLabel.Name = Text.Replace(" ", "") + "Label";
            aLabel.Content = Text + ": ";
            aLabel.HorizontalAlignment = HorizontalAlignment.Right;
            aLabel.VerticalAlignment = VerticalAlignment.Center;
            aLabel.Margin = new Thickness(0);
            aLabel.FontFamily = Form.DIN;
            aLabel.FontSize = 29.333;

            Grid.SetRow(aLabel, Count);
            Grid.SetColumn(aLabel, 0);
            Form.MainGrid.Children.Add(aLabel); //Haha! We're adding it to a Grid in "Form"!
        }


    }
}

4
投票
var targetWindow = Application.Current.Windows.Cast<Window>().FirstOrDefault(window => window is principal) as principal;
targetWindow .BssAcesso.Background = Brushes.Transparent;

只需从当前窗口调用它的任何控件即可:

targetWindow.ABUTTON.Background = Brushes.Transparent;

如何从wpf中的另一个窗口访问一个窗口的控件(richtextbox)?


3
投票

当我开始使用 WPF 时,我也遇到过这个问题。然而,我找到了一个很好的解决方法,类似于老式的 win 表单方法(VB.NET 编码,抱歉)。补充一下之前说过的话:

直接更改模块或活动窗口的不同类中的对象属性:

Public Class Whatever
    Public Sub ChangeObjProperties()
        ' Here the window is indexed in case of multiple instances of the same
        ' window could possibly be open at any given time.. otherwise just use 0
        Dim w As MainWindow = Application.Current.Windows(0)
        w.Button1.Content = "Anything"
    End Sub
End Class

显然,您必须先实例化

Whatever
,然后才能在代码中调用
ChangeObjProperties()

此外,无需担心 XAML 中有关对象可访问性的命名。


1
投票

只需像这样声明您的控件即可将其公开:

<TextBox x:Name="textBox1" x:FieldModifier="public" />

然后您可以从另一个控件访问它。


1
投票

控件默认声明为非公开,内部不公开!

因此允许从同一组件内访问控件。如果要从另一个程序集访问 wpf 表单上的控件,则必须使用修饰符属性 x:FieldModifier="public" 或使用 Jean 提出的方法。


-1
投票

这可能是一个稍微不同的答案,但是让我们思考一下为什么我们需要在表单之间传递数据。 显然,原因是“可视化”。

使用委托或事件。

不需要仅仅为了使其可见而将元素声明为 Public。 只需要能够在有限的基础上使用 delegate 转换窗口内的元素。


-2
投票

访问另一个窗口中的任何控件是如此简单。 假设从登录窗口访问主窗口。 步骤如下:

MainWindow MW = new MainWindow();  //declare the mainwindow
MW.Label1.Content = "Hello world"; //specify what control
MW.ShowDialog();                   //check what happen to that control

良好的编程

© www.soinside.com 2019 - 2024. All rights reserved.