【问题标题】:Why aren't new WPF Windows I create inheriting from Window?为什么我创建的新 WPF Windows 不是从 Window 继承的?
【发布时间】:2016-10-24 10:00:10
【问题描述】:

当我创建一个新窗口时,使用添加项目...对话框,我创建的窗口,例如NewWindow,不继承自 Window。它只具有与Object 类型相同的接口。一个例子:

我有下面的弹出窗口代码。代码只看到 IHavePassword 成员,而不是 `LoginPopup' 的其余成员,就像它的控件一样。

Public Class LoginPopup
    Implements IHavePassword

    Public ReadOnly Property Password As SecureString Implements IHavePassword.Password
        Get
            'Return Me.PasswordBox.????
        End Get
    End Property

    Public Event PasswordChanged As RoutedEventHandler Implements IHavePassword.PasswordChanged
    Public Sub PassWordChangedHandler(sender As Object, e As EventArgs)
        PasswordChangedEvent(sender, e)
    End Sub

    Public Sub Close() Implements IHavePassword.Close
        Throw New NotImplementedException
    End Sub

End Class

哦,这里也是必要的 XAML:

<Window x:Class="ApptEase.Client.Prism.Views.LoginPopup"
....
<StackPanel Orientation="Vertical" Margin="0">
    <DockPanel LastChildFill="True">
        <TextBlock Text="{Binding Path=UsernameLabel}" DockPanel.Dock="Left" TextAlignment="Right" Margin="5,9,5,5" MinWidth="70" />
        <TextBox Text="{Binding Path=Username, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True}" Width="Auto" Margin="5" />
    </DockPanel>
    <DockPanel LastChildFill="True">
        <TextBlock Text="{Binding Path=PasswordLabel}" DockPanel.Dock="Left" TextAlignment="Right" Margin="5" MinWidth="70" />
        <PasswordBox x:Name="PasswordBox" PasswordChanged="PassWordChangedHandler" Width="Auto" Margin="5" />
    </DockPanel>
    <DockPanel LastChildFill="True" Height="59">
        <StackPanel Orientation="Horizontal" HorizontalAlignment="Right">
            <Button Content="Log in" Command="{Binding Path=LoginCommand}" CommandParameter="{Binding ElementName=This}" Margin="5" Padding="15,10,15,10" />
            <Button Content="Cancel" Command="{Binding Path=CancelCommand}" CommandParameter="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" Margin="5" Padding="15,10,15,10"/>
        </StackPanel>
    </DockPanel>
</StackPanel>

Me 属性上的 IntelliSense 列出了 IHavePassword 的成员,例如:

我希望在这里看到控件和基础Window 成员,而不是界面中的那些。我该如何解决这个问题?

【问题讨论】:

  • 有识字的人可以解释一下否决票吗?对于我要问的问题,这个问题非常清楚。这是私人的还是什么?
  • 仅作记录:我没有否决您的问题。
  • 为了记录,我从来没有怀疑过你,@haindl。
  • 是项目/解决方案特定的问题,还是 VS 安装特定的问题?也就是说,创建一个新项目并添加一个窗口会重现这种行为吗?另外,我自己无法复制它。

标签: .net wpf interface wpf-controls implements


【解决方案1】:

我想你只是忘了用你的命名空间来包围这个类:

Namespace ApptEase.Client.Prism.Views
    Public Class LoginPopup
        Implements IHavePassword

        '...

    End Class
End Namespace

【讨论】:

  • 不,我没有忘记,而且ApptEase.Client.Prism.Views.LoginPopup 不是命名空间而是类型名。我用namespace ApptEase.Client.Prism.Views 包围它,Visual Studio 会自动转换为namespace Views。也就是说,它从任何namespace 语句中删除根命名空间,只留下根的扩展名,在本例中为Views
  • @ProfK 你对类型名称是绝对正确的。我犯了一个快速复制/粘贴错误并编辑了我的帖子以纠正它。不幸的是,我更像是一名 C# 开发人员,而我上次的 VB.NET 经验可以追溯到几年前。在我的快速测试中,错误的命名空间正是导致您出现这种问题的原因,但我想这个错误还有更多潜在原因。哦,好吧,我认为这就是 VB.NET 附带的那种“魔法”:如果它有效,那就完美了。如果没有,祝你好运。根本原因当然是VB.NET没有从LoginPopup继承Window,所以它只是从Object派生而来。
  • 它确实继承自 Window,也是血腥的幕后故事。
  • @ProfK 如果您打开 Visual Studio 对象浏览器并选择您的 LoginPopup 类,您会看到什么?你看到Public Class LoginPopup Inherits System.Windows.Window了吗?当您展开“基本类型”节点时,您会看到什么?你看到IHavePasswordWindow 了吗? (当然,如果需要,您也可以使用任何其他工具,如 Reflector、ILSpy、JustDecompile、dotPeek 或 ILDASM。)
  • 不,它只继承自对象,但 LoginPopUp 部分类的其他部分在后台生成,在 obj\Debug\Views 中,称为 LoginPopup.g.vb,包含声明 @987654338 @ 和名为 LoginPopup.g.i.vb 的第三部分也包含项目中基于“部分公共类 LoginPopup. The same is now true for all Window”的视图的相同声明。我将Partial 添加到主类(解决方案资源管理器中可见的那个)没有任何区别。我先用 C# 重写,所以我可以很快得到一个过期 2 天的演示。
【解决方案2】:

可以肯定的是,在您的 cmets 中,您说 LoginPopup 是一个部分类,但在您的代码中,您没有“部分声明”。我主要是 C# 开发人员,所以我不确定,但它不应该存在“Partial Public LoginPopup”吗?

【讨论】:

  • VB voodoo 解决了这个问题。
【解决方案3】:

回答所提出的问题。

添加一个新的“Window...”而不是使用“Add Item...”并创建一个新的泛型类。然后添加您的自定义代码。

【讨论】:

  • 我确实添加了一个 Window,而不仅仅是一个新的泛型类,不管是什么。 “添加项目...->窗口”与“添加...->窗口”完全相同。他们都添加了一个设备齐全的窗户。
  • 当命名空间与 xaml 文件中的内容不匹配时,我会得到相同的行为。在 LoginPopup 类声明周围添加命名空间为我修复了它。
【解决方案4】:

首先,这与部分类或从Window 继承无关,正如许多 cmets 所建议的那样。 VB WPF 窗口的项目模板妥善处理了所有这些问题;我们很久以前就停止了“手动编码”UI 窗口和控件。

然后,我已经放弃找出造成这种情况的原因,除非很可能是项目文件或 VS 功能失调。我创建了一个新的 VB WPF 项目,在这个项目中,当我添加一个新的Window 时,一切都很好,即继承是正确的。

【讨论】:

    猜你喜欢
    • 2013-09-20
    • 2020-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2013-05-14
    • 2014-08-26
    相关资源
    最近更新 更多