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

时间:2012-11-30 11:12:56

标签: c# wpf silverlight

我想在WPF中的mainWindow中访问我的控件,如按钮或文本框,但我不能这样做。

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

8 个答案:

答案 0 :(得分:26)

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

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

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

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

答案 1 :(得分:7)

不幸的是,WPF的基础是数据绑定。以任何其他方式做这件事是“反对谷物”,这是一种不好的做法,而且编码和理解通常要复杂得多。

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

在您的代码中,只管理您的视图模型类,并且不要使用其可视控件和视觉合成来触摸实际视图。

答案 2 :(得分:4)

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

看起来很复杂,但非常容易! 但是,也许不是最佳做法。

假设我们在MainWindow中有一个Label1,一个Button1,并且你有一个类来处理与用户界面相关的任何东西,称为UI。

我们可以拥有以下内容:

MainWindow类:

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"!
        }


    }
}

答案 3 :(得分:3)

当我开始使用WPF时,我也在努力解决这个问题。但是,我找到了一个很好的方法,类似于老式的胜利形式方法(编写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中有关对象可访问性的命名。

答案 4 :(得分:2)

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

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

targetWindow.ABUTTON.Background = Brushes.Transparent;

How can I access one window's control (richtextbox) from another window in wpf?

答案 5 :(得分:1)

只需声明您的控件,将其公开:

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

然后,您可以从其他控件访问它。

答案 6 :(得分:0)

控件的默认声明是非公开的,内部的而不是公开的!

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

答案 7 :(得分:-1)

访问另一个窗口中的任何控件都非常简单。让我们说从登录窗口访问MainWindow。以下是步骤:

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

良好的编程