【问题标题】:Setting a WPF button to visible within an IConnectionPoint event handler将 WPF 按钮设置为在 IConnectionPoint 事件处理程序中可见
【发布时间】:2011-03-18 23:30:31
【问题描述】:

我是 C# 和 WPF 编程的新手,现在这个问题让我很头疼。

程序应该做什么:程序会显示一个带有文本框的欢迎屏幕,客户可以在其中输入他的姓名。 如果设备靠近无线 LAN 接入点并成功连接,则此主窗口上的“开始”按钮应可见。

什么不起作用:在事件处理程序中设置按钮可见性。未应用新样式。此外,如果我在设置可见性属性/属性(?)之后尝试调用任何其他代码,它将不会运行(如果我在设置 visib 之前放置了 MessageBox.Show。如果我在设置后放置它,它将显示属性,甚至不会再访问此代码)。

代码:

这是按钮元素:

<Button Height="72" HorizontalAlignment="Center" Margin="319,507,315,0"
        Name="buttonStart" VerticalAlignment="Top" Width="168" FontSize="32"
        Content="Los geht's" Click="buttonStart_Click" />

这是 MainWindow.xaml.cs 中的事件处理程序注册

public partial class MainWindow : Window, INetworkListManagerEvents
{
    private INetworkListManager nlm_;
    private IConnectionPoint nlmICP_;
    private int nlmCookie_ = 0;

    private void InitNetManager()
    {
        nlm_ = new NetworkListManager();
        IConnectionPointContainer icpc = (IConnectionPointContainer)nlm_;
        Guid tempGuide = typeof(INetworkListManagerEvents).GUID;
        icpc.FindConnectionPoint(ref tempGuide, out nlmICP_);
        nlmICP_.Advise(this, out nlmCookie_);
    }

最后是事件处理程序:

    public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
    {
        if (newConnectivity == NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED ||
            ((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_NOTRAFFIC) != 0)
        {
            MessageBox.Show("Disconnected"); // this will code is reached
            buttonStart.Visibility = Visibility.Hidden; // this is not getting applied
            MessageBox.Show("Disconnected");  // this will code is not reached (stepped with debugger)
        }

        if ((((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_LOCALNETWORK) != 0) ||
            (((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_INTERNET) != 0))
        {
            MessageBox.Show("Connected"); // see comments above
            buttonStart.Visibility = Visibility.Visible;
        }
    }

就是这样 - 我希望你能帮助我。

非常感谢您的努力!

【问题讨论】:

    标签: c# wpf c#-4.0 iconnectionpoint


    【解决方案1】:

    嗯 - 现在我为回答自己的问题感到难过,但我解决这个问题的冲动让我一直在谷歌上搜索,最后我发现,我只能从 UI 线程更改我的 WPF 元素,但 INetwork-Events 是在不同的线程中调用。

    所以我这样解决了:

        public void ConnectivityChanged(NLM_CONNECTIVITY newConnectivity)
        {
            if (newConnectivity == NLM_CONNECTIVITY.NLM_CONNECTIVITY_DISCONNECTED ||
                ((int)newConnectivity & (int)NLM_CONNECTIVITY.NLM_CONNECTIVITY_IPV4_NOTRAFFIC) != 0)
            {
                Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(
                    delegate()
                    {
                        buttonStart.Visibility = Visibility.Hidden;
                    }
                ));
            }
            // ...
        }
    

    感谢您的宝贵时间 :)

    【讨论】:

      【解决方案2】:

      不是您的问题的直接答案(因为它已经回答了),但 WPF 做事的方式是拥有一个属性 CanConnect 您将可见性绑定到(使用布尔到可见性转换器)。

      每当您在代码中触摸 UI 控件时,这都是您的设计需要改进的一个很好的指标。

      【讨论】:

      • 这不一定适用于所有 WPF,但更适用于 MVVM。
      • 嗯,WPF 的核心点之一是数据绑定,所以你应该利用它——不管你是否使用 MVVM 模式。
      • 谢谢,我会调查的。总是欢迎“如何以正确的方式做事”的指针:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-02
      相关资源
      最近更新 更多