.Net:在开发软件时,对于一些流行的任务,例如禁用/启用toolstrip按钮的所有按钮,您的方法是什么?

.Net:在开发软件时,对于一些流行的任务,例如禁用/启用toolstrip按钮的所有按钮,您的方法是什么?,.net,.net,第一:对不起,我的英语写作很差 我记得在VB6.0时代,我们有一些模块只用于流行的任务,比如禁用/启用工具栏按钮的所有按钮,或者计算特定记录集中的记录数 现在,在.Net时代,您是如何完成这些流行任务的?您是否创建了一个静态类 谢谢 扩展方法为我取代了静态函数。(不再提供实用程序类) 编辑 这是一个为所有控件设置背景色的示例。您可以在模块中声明它们 <System.Runtime.CompilerServices.Extension()> _ Public Sub ChangeToR

第一:对不起,我的英语写作很差

我记得在VB6.0时代,我们有一些模块只用于流行的任务,比如禁用/启用工具栏按钮的所有按钮,或者计算特定记录集中的记录数

现在,在.Net时代,您是如何完成这些流行任务的?您是否创建了一个静态类

谢谢

扩展方法为我取代了静态函数。(不再提供实用程序类)

编辑 这是一个为所有控件设置背景色的示例。您可以在模块中声明它们

<System.Runtime.CompilerServices.Extension()> _
Public Sub ChangeToRed(ByVal f As form)
    For Each c in f.Controls
        c.BackColor = Color.Red
    End For
End Sub
_
公共子转换器(ByVal f作为表单)
对于每个c in f.控件
c、 背景色=颜色。红色
结束
端接头

在这之后,转到任何窗体,您都会看到ChangeToRed函数。

假设此处使用Windows窗体。类库中没有任何东西可以让这变得特别容易。然而,Application.Idle事件是有用的。它在任何鼠标或键盘输入事件之后,在处理所有Windows通知之后立即运行。这是一个计算按钮状态的好地方,否则直接从事件处理程序更新按钮状态会很困难

下面是一个更新标准复制、剪切、粘贴和撤消工具栏按钮的示例:

public partial class Form1 : Form {
    public Form1() {
        InitializeComponent();
        Application.Idle += new EventHandler(UpdateViewState);
    }
    private void UpdateViewState(object sender, EventArgs e) {
        bool canUndo = false;
        bool canCopy = false;
        bool canPaste = false;
        if (this.ActiveControl is TextBoxBase) {
            var box = this.ActiveControl as TextBoxBase;
            canUndo = box.CanUndo;
            canCopy = box.Text.Length > 0;
            canPaste = Clipboard.ContainsText();
        }
        undoButton.Enabled = canUndo;
        cutButton.Enabled = copyButton.Enabled = canCopy;
        pasteButton.Enabled = canPaste;
    }
}
对表单中的每个文本框的Enter、Leave、TextChanged的事件处理程序执行相同的操作会非常痛苦。

是的,我仍然在WPF应用程序中使用静态(C#)或共享(VB)方法来执行其中一些任务。我在泛型方法中使用XAML方法SetValue(DependencyProperty,Object)在mass上打开/关闭控件启用/可见属性。这允许您在XAML可视化树上来回走动来做一些事情。我发现执行这些任务的WPF方法所包含的代码比VB6方法所包含的代码要少,而且代码库比WindowsForms简单得多

VB.net WPF 3.5/4.0示例-控件可见性

''' <summary>
''' Use the Tag property to indicate if the controls visibility should be set or not.
''' </summary>
Shared Function ControlVisibilityByTag(ByVal element As Visual, ByVal tagContents As String, ByVal controlVisibility As Visibility) As Boolean
    Dim ControlList As List(Of Visual)
    ControlList = GetControlsByTag(element, tagContents)
    For myLoop As Integer = 0 To ControlList.Count - 1
        '   LL: SetValue is a cool alternative to strongly typing controls and setting a controls visibility. Thanks to Linda Lui at Microsoft
        ControlList.Item(myLoop).SetValue(Control.VisibilityProperty, controlVisibility)            
    Next
    Return ControlList.Count > 0
End Function

Public Shared Function GetControlsByTag(ByVal element As Visual, ByVal tagContents As String) As List(Of Visual)
    If element Is Nothing Then
        Throw New ArgumentNullException([String].Format("Element {0} is null !", element.ToString()))
    End If
    If _NamedControllist Is Nothing Then
        _NamedControllist = New List(Of Visual)
    Else
        _NamedControllist.Clear()
    End If

    GetNestedControlsListByTag(element, 0, tagContents)

    Return _NamedControllist
End Function

Private Shared Sub GetNestedControlsListByTag(ByVal control As Visual, ByVal level As Integer, ByVal tagContents As String)
    Dim ChildNumber As Integer = VisualTreeHelper.GetChildrenCount(control)

    For i As Integer = 0 To ChildNumber - 1
        Dim v As Visual = DirectCast(VisualTreeHelper.GetChild(control, i), Visual)
        '   LL: GetValue is a cool alternative to strongly typing controls to read a standard control property value. Thanks to Linda Lui at Microsoft
        If Not IsNothing(v.GetValue(FrameworkContentElement.TagProperty)) AndAlso v.GetValue(FrameworkContentElement.TagProperty).ToString() = tagContents Then
            _NamedControllist.Add(v)
        End If            

        If VisualTreeHelper.GetChildrenCount(v) > 0 Then
            GetNestedControlsListByTag(v, level + 1, tagContents)
        End If
    Next
End Sub
“”
''使用Tag属性指示是否应设置控件可见性。
''' 
共享函数ControlVisibilityByTag(ByVal元素为可视,ByVal tagContents为字符串,ByVal controlVisibility为可视)为布尔值
Dim控制器列表(可视)
ControlList=GetControlsByTag(元素,标记内容)
对于myLoop,将其作为Integer=0发送到ControlList.Count-1
LL:SetValue是一个很酷的选择,它可以代替强键入控件和设置控件可见性。感谢微软的琳达·吕
ControlList.Item(myLoop).SetValue(Control.VisibilityProperty,controlVisibility)
下一个
返回控制器。计数>0
端函数
公共共享函数GetControlsByTag(ByVal元素为可视,ByVal标记内容为字符串)为列表(可视)
如果元素为空,则
抛出新ArgumentNullException([String].Format(“元素{0}为null!”,元素.ToString()))
如果结束
如果_NamedControllist为Nothing,则
_NamedControllist=新列表(可视的)
其他的
_NamedControllist.Clear()
如果结束
GetNestedControlsListByTag(元素,0,标记内容)
返回\u NamedControllist
端函数
私有共享子GetNestedControlsListByTag(ByVal控件为可视,ByVal级别为整数,ByVal标记内容为字符串)
Dim ChildNumber为整数=VisualTreeHelper.GetChildrenCount(控件)
对于i作为整数=0到ChildNumber-1
Dim v As Visual=DirectCast(VisualTreeHelper.GetChild(控件,i),可视)
'LL:GetValue是一个很酷的选择,它可以代替强键入控件来读取标准控件属性值。感谢微软的琳达·吕
如果不是,则为Nothing(v.GetValue(FrameworkContentElement.TagProperty))和v.GetValue(FrameworkContentElement.TagProperty).ToString()=tagContents,然后
_NamedControllist.Add(v)
如果结束
如果VisualTreeHelper.GetChildrenCount(v)>0,则
GetNestedControlsListByTag(v,级别+1,标记内容)
如果结束
下一个
端接头

类似这样的框架还提供了一些内置控件/菜单功能,以根据通过XAML数据绑定绑定的类的状态启用和禁用菜单/按钮。这对于CRUD操作和记录导航特别有用。但是,即使使用框架,我发现我的WPF应用程序中也需要一些通用的查找控件和更改控件属性方法,我很乐意继续使用共享/静态方法。

+1,我喜欢在应用程序中这样做。Idle event,我没想到。1-谢谢你,但我想我需要对你说的话做更多的解释……你能再解释一下吗?2-如果我们有一个包含(例如)100个winforms的项目,那么执行诸如启用/禁用这些表单的工具栏按钮之类的流行任务的最佳方法(在哪里?)是什么?把你写的东西放在每一个表格里?我没说太多,只是试着让代码说话。也许你可以问一个直接的问题?您只需将此代码放在一个表单中,就可以从中继承所有其他表单。谢谢,但是如果我们在项目中的每个winform中都使用更多的winform来执行这些任务呢?在哪里声明扩展方法?