【问题标题】:Access WPF window control from another assembly从另一个程序集访问 WPF 窗口控件
【发布时间】:2015-09-17 04:35:18
【问题描述】:

我有一个库 DLL,以及一个依赖于该库的 WPF 测试 exe。这是测试exe:

using MyLibrary;

namespace WpfTest
{
    public partial class Window2 : Window
    {
        private MyLibrary _mylib;

        public Window2()
        {
            InitializeComponent();
            this.Loaded += window2Loaded;
        }

        void window2Loaded(object sender, RoutedEventArgs e)
        {
            _mylib = new MyLibrary(this);
        }
    }
}

在 MyLibrary 类中(在 DLL 中),我有以下构造函数:

    public MyLibrary (System.Windows.Window window) // BREAKPOINT HERE.
    {
        ...

在上面的断点处,调试器显示我要访问的TextBlock (tb_mp):

当我在 Visual Studio 中键入 window.tb_ 时,我需要做什么,IntelliSense 将提供以 window.tb_mp 完成它?

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    没什么,你不能。 Locals 寡妇在 tb_mp 本地旁边显示一个信封图标,这意味着它是 internal 成员(请参阅此处:https://msdn.microsoft.com/en-us/library/y47ychfe(v=vs.100).aspx)。 Visual Studio 的智能感知窗口不会列出您无权访问的成员,在本例中,是来自另一个项目的 internal 成员。

    共有三个选项:

    1. 将访问修饰符(在原始项目中)更改为public

    2. 使用反射访问字段(例如FieldInfo fi = window.GetType().GetField("tb_mp")

    3. 使用VisualTreeHelper 遍历窗口中的控件。这是一个更复杂的话题,在这里详细讨论:How can I find WPF controls by name or type? 和这里:WPF: How do I loop through the all controls in a window?

    【讨论】:

    • 谢谢。直到今天我都不知道信封图标,更不用说知道它的含义了!为tb_mp 提供x:FieldModifier="public" 可以打开对它的访问,但我还必须将window 变量转换为((WpfTest.Window2)(当然,还要提供命名空间)才能启动IntelliSense。
    猜你喜欢
    • 1970-01-01
    • 2021-08-16
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多