未为参数指定实参

2023-12-01

使用 VB.net 和 WPF

我已经转换了可用的代码使用装饰器覆盖 WPF 中的控件从 C# 到 VB.Net

原始 C# 代码

    /// <summary> 
/// Overlays a control with the specified content 
/// </summary> 
/// <typeparam name="TOverlay">The type of content to create the overlay from</typeparam> 
public class OverlayAdorner<TOverlay> : Adorner, IDisposable where TOverlay : UIElement, new()
{
    private UIElement _adorningElement; private AdornerLayer _layer; /// <summary> /// Overlay the specified element /// </summary> /// <param name="elementToAdorn">The element to overlay</param> /// <returns></returns> public static IDisposable Overlay(UIElement elementToAdorn) { return Overlay(elementToAdorn, new TOverlay()); } 
    /// <summary> 
    /// Overlays the element with the specified instance of TOverlay 
    /// </summary> 
    /// <param name="elementToAdorn">Element to overlay</param> 
    /// <param name="adorningElement">The content of the overlay</param> 
    /// <returns></returns> 
    public static IDisposable Overlay(UIElement elementToAdorn, TOverlay adorningElement)
    {
        var adorner = new OverlayAdorner<TOverlay>(elementToAdorn, adorningElement);
        adorner._layer = AdornerLayer.GetAdornerLayer(elementToAdorn);
        adorner._layer.Add(adorner);
        return adorner as IDisposable;
    }

    private OverlayAdorner(UIElement elementToAdorn, UIElement adorningElement)
        : base(elementToAdorn)
    {
        this._adorningElement = adorningElement;
        if (adorningElement != null)
        {
            AddVisualChild(adorningElement);
        }
        Focusable = true;
    }

    protected override int VisualChildrenCount
    {
        get { return _adorningElement == null ? 0 : 1; }
    }

    protected override Size ArrangeOverride(Size finalSize)
    {
        if (_adorningElement != null)
        {
            Point adorningPoint = new Point(0, 0);
            _adorningElement.Arrange(new Rect(adorningPoint, this.AdornedElement.DesiredSize));
        }
        return finalSize;
    }

    protected override Visual GetVisualChild(int index)
    {
        if (index == 0 && _adorningElement != null)
        {
            return _adorningElement;
        }
        return base.GetVisualChild(index);
    }
    public void Dispose()
    {
        _layer.Remove(this);
    }
}

VB.Net代码(我转换的)

Public Class OverlayAdorner(Of TOverlay As {UIElement, New})
Inherits Adorner
Implements IDisposable

Private _adorningElement As UIElement
Private _layer As AdornerLayer

Public Shared Function Overlay(elementToAdorn As UIElement, adorningElement As TOverlay) As IDisposable
    Dim adorner = New OverlayAdorner(Of TOverlay)(elementToAdorn, adorningElement)
    adorner._layer = AdornerLayer.GetAdornerLayer(elementToAdorn)
    adorner._layer.Add(adorner)
    Return TryCast(adorner, IDisposable)
End Function

Private Sub New(elementToAdorn As UIElement, adorningElement As UIElement)
    MyBase.New(elementToAdorn)
    Me._adorningElement = adorningElement
    If adorningElement IsNot Nothing Then
        AddVisualChild(adorningElement)
    End If
    Focusable = True
End Sub

Protected Overrides ReadOnly Property VisualChildrenCount() As Integer
    Get
        Return If(_adorningElement Is Nothing, 0, 1)
    End Get
End Property

Protected Overrides Function ArrangeOverride(finalSize As Size) As Size
    If _adorningElement IsNot Nothing Then
        Dim adorningPoint As New Point(0, 0)
        _adorningElement.Arrange(New Rect(adorningPoint, Me.AdornedElement.DesiredSize))
    End If
    Return finalSize
End Function

Protected Overrides Function GetVisualChild(index As Integer) As Visual
    If index = 0 AndAlso _adorningElement IsNot Nothing Then
        Return _adorningElement
    End If
    Return MyBase.GetVisualChild(index)
End Function

Public Sub Dispose() Implements IDisposable.Dispose
    _layer.Remove(Me)
End Sub
End Class

现在我已经在我的测试项目中创建了 MainWindow 和用户控件 UserControl1 并尝试代码

        Using OverlayAdorner(Of UserControl1).Overlay(G1)
               'Err in First Line Itself

        End Using

未为“公共共享函数覆盖(elementToAdorn As System.Windows.UIElement,adorningElement As TOverlay)As System.IDisposable”的参数“adorningElement”指定错误参数。

这里出了什么问题


您所引用的博客文章中给出的以下代码块显示了不正确的用法。

using (OverlayAdorner<ProgressMessage>.Overlay(LayoutRoot)) 
{ 
   // Do some stuff here while adorner is overlaid
}

应该是(在 C# 中):

using (OverlayAdorner<ProgressMessage>.Overlay(LayoutRoot, this)) // Here I assume `this` is somehow `UserControl`'s object
{ 
   // Do some stuff here while adorner is overlaid
}

在VB.NET中

Using OverlayAdorner(Of UserControl).Overlay(G1, UserControl1)
   ' Do some stuff here while adorner is overlaid
End Using

另请注意:OverlayAdorner(Of UserControl1)应该OverlayAdorner(Of UserControl)因为T这里应该是类型的名称而不是对象实例的名称。

我希望这有帮助。

一些说教

从你的这个问题中我得到暗示,你需要在语言方面多下功夫。为 VB.NET 或 C#.NET 提供更多时间,并在 Visual Studio 中使用智能感知来熟悉类库和要传递到您使用的方法中的参数类型。这将帮助您在有一些文档或没有文档的新类库中工作。

I use this shortcut more when working in new class libaries. Type ctrl+k then ctrl+i. Generally said as ctrl+k,i

Update

根据最近的评论,检查以下实际使用情况:

XAML 片段:

<Window x:Class="WpfTestApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid x:Name="G1">
        <UserControl x:Name="ucMyControl"></UserControl>
    </Grid>
</Window>

代码片段背后:

Using OverlayAdorner(Of UserControl).Overlay(G1, ucMyControl)
   ' Do some stuff here while adorner is overlaid
End Using
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未为参数指定实参 的相关文章

随机推荐