小编Lio*_*nAM的帖子

WPF从Parent中覆盖IsEnabled

我刚刚搜索了一种在父控件启用时启用子控件的方法IsEnabled = false.到目前为止我发现的所有答案都说不可能 - 必须启用父级并禁用子控件,除了应该仍然启用的子控件.

但是,通过覆盖App.xaml.cs文件中IsEnabledProperty的元数据,我能够更改此默认行为:

protected override void OnStartup(StartupEventArgs e)
{
    UIElement.IsEnabledProperty.OverrideMetadata(typeof(FrameworkElement),
             new UIPropertyMetadata(true,IsEnabledChanged, CoerceIsEnabled));
}

private void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    var childrenCount = VisualTreeHelper.GetChildrenCount(d);
    for (int i = 0; i < childrenCount; ++i)
    {
        var child = VisualTreeHelper.GetChild(d, i);
        child.CoerceValue(UIElement.IsEnabledProperty);
    }
}
private object CoerceIsEnabled(DependencyObject d, object basevalue)
{
    var parent = VisualTreeHelper.GetParent(d) as FrameworkElement;
    if (parent != null && parent.IsEnabled == false)
    {
        if (d.ReadLocalValue(UIElement.IsEnabledProperty) == DependencyProperty.UnsetValue)
        {
            return false;
        }
    }
    return …
Run Code Online (Sandbox Code Playgroud)

c# wpf dependency-properties

16
推荐指数
2
解决办法
5209
查看次数

Visual Studio概要分析:从代码启动/停止

是否有可能从代码中启动/停止visual studio(Professional 2012+)分析器?我知道你可以暂停它,但要开始分析,你必须点击visual studio中的一个按钮.

在我的情况下,我想在我的应用程序中单击一个按钮时启动它,该按钮切换到一个新视图,并在加载UI时自动停止它.我想知道为什么在UI出现之前有这么大的延迟.

c# profiling visual-studio

5
推荐指数
1
解决办法
978
查看次数

yield return语句中静态成员的初始化顺序

我只是注意到,通过yield return返回的静态成员的初始化不是按照它们枚举的顺序,而是以相反的顺序.虽然C1实例作为迭代器的第一项返回,但首先创建C2实例.如果产生超过2个项目,则最后一个项目首先被初始化.

public abstract class B
{
    private static int _number;

    protected B()
    {
        Number = ++_number;
    }
    public int Number { get; private set; }
}

class C1 : B
{
    public static readonly C1 Default = new C1();
}

class C2 : B
{
    public static readonly C2 Default = new C2();
}

public static IEnumerable<B> GetItems()
{
    yield return C1.Default;
    yield return C2.Default;
}

private static void Main(string[] args)
{
    var items = GetItems();

    foreach (var item …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable yield-return

3
推荐指数
1
解决办法
162
查看次数

从 .NET Framework 移植到 .NET 时出现不明确的扩展方法 GetValueOrDefault

在将我的(大型)应用程序从 .NET Framework 4.X 移植到 .NET 5+ 时,偶然发现了System.Collections.Generic.CollectionExtensions.NET Framework 中不存在的新 .NET Framework。在它存在之前,我创建了一个扩展方法GetValueOrDefault,它具有与新方法类似的签名 - 但不同之处在于我检查空键并在这种情况下返回默认值而不是抛出异常。

在某些情况下,我得到了不明确的匹配 - 但并非总是如此(大概是因为我的方法有一个默认参数值)。现在,大部分时间都使用 .NET 版本,而我的应用程序到处崩溃......

有没有办法全局隐藏扩展方法或始终更喜欢我的版本?

PS:我知道存在类似的问题(模糊的扩展方法),但它已经很老了,约会于.NET core之前

关于重命名:实际上,我不想重命名我的方法。

  1. 它在 .NET Core 之前就已存在
  2. 当我重命名它时,我可能会不小心调用.NET版本(我已经习惯这个名字很多年了),这可能会在我不期望的时候抛出异常。我没有看到任何真正的用例,当这个方法抛出而不是返回默认值时会很有用。

.net c# extension-methods ambiguous-call

1
推荐指数
1
解决办法
127
查看次数

将 Git 分支置于其他分支中的提交状态

假设我有 2 个分支 A(旧的)和 B(新的),最近分开了。在 A2 中我犯了一些错误(破坏了我想保留的一些文件的历史记录),我用 B2 修复了这些错误。

我想将分支B的工作目录带到提交A3的状态,但不合并/提交它。相反,我更喜欢只进行(暂存/未暂存)本地更改,以便在下一次提交后,B3 将与 A3 相同(但不以任何方式链接到 A2 或 A3):

A1 - [A2 - A3 - A4]  (A will be deleted after the fix)
   \
     B2 - B3=(state of)A3 - A4
Run Code Online (Sandbox Code Playgroud)

在我的例子中这样做的原因是我搞乱了中间状态A2,我想用B2修复它,然后直接用A3继续。

我想到的最简单的方法是在另一个文件夹中签出 A3,删除 B 的内容并用 A3 的内容覆盖。

有没有Git命令可以直接实现这个功能?

git version-control merge branch

0
推荐指数
1
解决办法
372
查看次数