未为参数指定参数 [英] Argument not specified for parameter

查看:109
本文介绍了未为参数指定参数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用VB.net& WPF

Using VB.net & WPF

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

I've converted code available at Overlaying Controls in WPF with Adorners from C# to 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 并尝试代码

Now I've created MainWindow & an User Control UserControl1 in my test project and trying code

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

        End Using

错误参数未为公共共享功能覆盖(elementToAdorn作为System.Windows.UIElement,adorningElement作为TOverlay)作为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(O f UserControl1)应该为 OverlayAdorner(UserControl),因为 T 此处应为Type的名称不是对象实例的名称。

Also note that: OverlayAdorner(Of UserControl1) should be OverlayAdorner(Of UserControl) because T here should be Type's name not name of object instance.

我希望对您有所帮助。

一些讲道

从您的这个问题中我得到暗示,您需要在语言方面做更多的工作。给VB.NET或C#.NET更多的时间,并在Visual Studio中使用智能感知,以使自己熟悉要传递给所使用方法的类库和参数类型。这将帮助您在没有文档的新类库中工作。

From this question of yours I get hint that you need to work yourself on language more. Give more time to VB.NET or C#.NET and use intellisense in Visual Studio to get yourself familiar with the class library and parameter types to be passed into methods you use. This will help you working in new class libraries which have some to no documentation.

在新类库中工作时,我会更多地使用此快捷方式。输入 ctrl + k ,然后输入 ctrl + i 。通常表示为 ctrl + k i

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

根据最近的评论,检查下面的实际用法:

Based on recent comment, Check the actual usage below:

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

这篇关于未为参数指定参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆