相关疑难解决方法(0)

在不将其添加到窗口的情况下测试WPF控件

我有一个在其活动中UserControl发布EventAggregator消息Loaded.为了测试这个(并Loaded引发事件)我正在创建一个窗口并向其添加控件,然后等待Loaded事件被引发.

有没有办法设置测试,以便Loaded事件触发而无需创建控件并将其添加到窗口?

例如:

[Test, RequiresSTA]
public void active_thingy_message_is_published_on_loaded()
{
    const string TestMsg = "Active thingy changed";

    using (AutoResetEvent loadedEvent = new AutoResetEvent(false))
    {
        DummyEventService eventService = new DummyEventService();                
        DummyControl control = new DummyControl(eventService, TestMsg);
        control.Loaded += delegate { loadedEvent.Set(); };

        Assert.That(eventService.Message, Is.Null, "Before.");
        Window window = new Window { Content = control };
        window.Show();                
        loadedEvent.WaitOne();
        window.Dispatcher.InvokeShutdown();
        Assert.That(eventService.Message, Is.EqualTo(TestMsg), "After.");
    }
}

private class DummyControl : UserControl
{
    public …
Run Code Online (Sandbox Code Playgroud)

c# testing wpf user-controls

12
推荐指数
3
解决办法
4299
查看次数

嵌入式单声道:如何在C++中引发事件?

我正在开发一个嵌入Mono的应用程序,我想将一个事件从C++层引发到C#层.这就是我所拥有的:

 void* itr(NULL);
 MonoEvent* monoEvent;
 while(monoEvent= mono_class_get_events(klass, &itr))
 {
     if(0 == strcmp(eventName, mono_event_get_name(monoEvent)))
         raiseMethod = mono_event_get_raise_method(monoEvent);
 }
Run Code Online (Sandbox Code Playgroud)

但是,raiseMethod总是以NULL形式返回.看一下MonoEvent的结构,看起来像是添加和删除方法,但不是加注?为了让它发挥作用,我有什么特别的事要做吗?

编辑:如果重要,这里是我在C#层使用的委托,类和事件的(基本)形式.

public delegate void MyHandler(uint id);
public class SimpleComponent : NativeComponent
{
    public event MyHandler OnEnter;
    public event MyHandler OnExit;
}
Run Code Online (Sandbox Code Playgroud)

c# c++ mono events

8
推荐指数
1
解决办法
777
查看次数

通过c#中的反射提升事件

我想编写一个可重用的函数来通过反射来引发事件.

搜索之后,我发现了类似的问题:如何通过.NET/C#中的反射来引发事件?

它一直有效,直到我向WinForm控件注册一个事件处理程序并尝试调用它.私人领域' <EventName>'简直消失了.

下面是我的简化代码,它可以重现问题:

Program.cs中:

public static void Main()
{
    Control control = new Control();
    control.Click += new EventHandler(control_Click);

    MethodInfo eventInvoker = ReflectionHelper.GetEventInvoker(control, "Click");
    eventInvoker.Invoke(control, new object[] {null, null});
}

static void control_Click(object sender, EventArgs e)
{
    Console.WriteLine("Clicked !!!!!!!!!!!");
}
Run Code Online (Sandbox Code Playgroud)

这是我的ReflectionHelper类:

public static class ReflectionHelper
{
    /// <summary>
    /// Gets method that will be invoked the event is raised.
    /// </summary>
    /// <param name="obj">Object that contains the event.</param>
    /// <param name="eventName">Event Name.</param>
    /// <returns></returns>
    public …
Run Code Online (Sandbox Code Playgroud)

c# reflection events

6
推荐指数
1
解决办法
6782
查看次数

如何从另一个类调用VRInput类事件(OnClick,OnDoubleClick,...)?

我正在为我的游戏添加重播功能.有了这个功能,我可以捕获用户对游戏的输入并稍后将它们反馈给Unity以重放游戏.但是VRStandardAssets.Utils.VRInput类的设计阻止了我模仿用户输入.

此类不提供任何公共方法,以便以编程方式触发其事件(例如OnClick或OnDoubleClick事件).所以我决定从它创建一个派生类,并编写我自己的公共方法来触发事件.此策略失败,因为VRInput的方法是私有的意思,我不能从派生类调用它们.

建议这类类提供受保护的虚拟void On [eventName](subclassOfEventArgs e)方法,以便为派生类提供一种使用覆盖来处理事件的方法,但是这个类没有它(为什么这么限制? ).我猜这是Unity的糟糕设计.这种糟糕的设计也使得编写单元/集成测试变得困难.

我在这里错过了什么吗?在重放游戏时,我还能做些什么来欺骗其他类认为他们正在处理VRInput类吗?

c# design-patterns unity-game-engine virtual-reality

6
推荐指数
1
解决办法
246
查看次数

如何提高派生类中的属性?

如何提高PropertyChangedSomePropertyB

此示例无法编译,因为PropertyChanged无法以这种方式访问​​...

public class A : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
}

public class B : A
{
    private object _someProperty;

    public object SomeProperty
    {
        get => _someProperty;
        set
        {
            _someProperty = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(SomeProperty)))
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

c# wpf events propertychanged inotifypropertychanged

0
推荐指数
1
解决办法
192
查看次数