小编Tim*_*ann的帖子

将实际十进制值作为属性的参数(例如xUnit.net的[InlineData]

我正在尝试使用xUnit.net进行单元测试.我想用'[InlineData]'进行'理论'测试,其中包括'小数':

[Theory]
[InlineData(37.60M)]
public void MyDecimalTest(decimal number)
{
    Assert.Equal(number, 37.60M);
}
Run Code Online (Sandbox Code Playgroud)

这是不可能的,因为您不能将小数创建为常量.我找到了解决方法,把数引号 LIK如此__CODE__.这实际上会将其转换为双重,这将使测试失败.

问题:
有解决方法吗?如果不是,为我的测试创建多个测试用例的最简单方法是什么?

c# decimal xunit.net

9
推荐指数
2
解决办法
5031
查看次数

Slider.Value会在不应该调整最小值时进行更改

简而言之:
在某些情况下,设置Slider.Minimum会调整Slider.Value,尽管当前值大于新的最小值.

代码:(应该是可重现的)
MainWindow.xaml:

<Window x:Class="WpfApplication1.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">
    <DockPanel>
        <Slider Name="MySlider" DockPanel.Dock="Top" AutoToolTipPlacement="BottomRight" />
        <Button Name="MyButton1" DockPanel.Dock="Top" Content="shrink borders"/>
        <Button Name="MyButton2" DockPanel.Dock="Top" VerticalAlignment="Top" Content="grow borders"/>
    </DockPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

MainWindow.xaml.cs:

using System.Windows;
using System.Windows.Controls;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            MySlider.ValueChanged += (sender, e) =>
            {
                System.Diagnostics.Debug.WriteLine("Value changed: " + e.NewValue);
            };

            System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MinimumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
            {
                System.Diagnostics.Debug.WriteLine("Minimum changed: " + MySlider.Minimum);
            });

            System.ComponentModel.DependencyPropertyDescriptor.FromProperty(Slider.MaximumProperty, typeof(Slider)).AddValueChanged(MySlider, delegate
            {
                System.Diagnostics.Debug.WriteLine("Maximum changed: " + …
Run Code Online (Sandbox Code Playgroud)

c# wpf slider

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

RelayCommand的常见实现是否违反了MVVM模式?

一个非常常见的实现RelayCommand似乎包括以下几行:

public event EventHandler CanExecuteChanged
{
    add
    {
        CommandManager.RequerySuggested += value;
    }
    remove
    {
        CommandManager.RequerySuggested -= value;
    }
}
Run Code Online (Sandbox Code Playgroud)

这对我来说似乎非常有缺陷,因为它CommandManager是一个WPF组件,通常我的命令位于viewmodel类中.由于viewmodel不应该知道视图并且应该使用不同的框架等,这对我来说似乎很奇怪.例如,如果将viewmodel分离到一个不知道WPF名称空间(例如PCL)的额外项目中,则甚至不可能实现此实现.

此实现是否违反了MVVM模式?
或者您可能会RelayCommand以某种方式放置在您的视图中?
如果确实存在缺陷,是否有解决此问题的最佳实践实施?

c# wpf mvvm relaycommand icommand

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

为什么1920设备无关单元不是1920像素,96 DPI?

我的Windows设置被设置为DPI为96.但是,当我创建以下内容时Window,它将比我的屏幕(设置为1920*1080分辨率)小一点:

<Window x:Class="WPF_Sandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Sandbox"
        mc:Ignorable="d"
        Title="MainWindow"
        Width="1920">
</Window>
Run Code Online (Sandbox Code Playgroud)

根据这篇 msdn博客文章:

1个设备独立像素= 1/96英寸.
1个物理像素= 1/DPI(取决于系统DPI)

默认系统设置通常选择DPI为96,因此这两种像素的大小相同.

然而,这似乎并非如此,因为我Window显然不到1920像素宽.
如果我最大化Window并检查ActualWidth它似乎是1936.

为什么会这样?

wpf dpi screen-resolution

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

为什么TargetNullValue更新可为空的Source

TargetNullValue应该Target在绑定Source评估时更新绑定null:

获取或设置当源的值为null时在目标中使用的值.

除此之外,当值等于给定时,它似乎也设置Sourcenull(如果可能的话).换句话说,它有效地建立了与财产价值之间的等价关系.但是文档中根本没有提到这一点.TargetTargetNullValuenullTargetNullValue

看这个例子:

<Window x:Class="WPF_Sandbox.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WPF_Sandbox"
        Title="MainWindow"
        x:Name="ThisControl">
    <StackPanel x:Name="MainStackPanel">
        <TextBox x:Name="MyTextBox" Text="{Binding NullableInt, ElementName=ThisControl, TargetNullValue='', UpdateSourceTrigger=PropertyChanged}" />
    </StackPanel>
</Window>


public partial class MainWindow : Window
{
    private int? nullableInt;

    public int? NullableInt
    {
        get { return nullableInt; }
        set { nullableInt = value; }
    }

    public MainWindow()
    {
        InitializeComponent();
    }
}
Run Code Online (Sandbox Code Playgroud)

注意:UpdateSourcetrigger仅设置为使测试更容易,并且与所讨论的效果无关.

如果你在NullableIntsetter中放置一个断点,你可以看到value == null …

c# data-binding wpf nullable

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

ValueTuples会使参数过时吗?

通过在C#7.0中引入ValueTuples,我们现在可以拥有多个返回值:

public (int sum, int count) GetTallies() 
{
    return (1, 2);
}
Run Code Online (Sandbox Code Playgroud)

我的印象是,out参数的唯一原因是提供一种限制只有一个返回值的解决方法。但是,out参数也得到了改进,这告诉我C#设计人员认为它们不会过时。

我是否缺少某些东西,或者是out var declaration为了简化旧库的使用而引入公正的原因?

为了进一步阐明这个问题:我可以做什么out,我不能做ValueTuples什么?

c# tuples out c#-7.0

7
推荐指数
0
解决办法
509
查看次数

在没有ReSharper的情况下在Visual Studio中使用dotPeek

dotPeek是免费的.NET反编译器。作为独立工具时,它也是ReSharper的一部分:如果告诉ReSharper导航到class.dll文件中的定义,它将自动反编译该文件并向您提供源代码。

我不想使用ReSharper。没有ReSharper可以得到相同或相似的功能吗?这是仅ReSharper的功能吗?

.net resharper decompiling visual-studio dotpeek

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

为什么Select(x => ... Cast <x.GetType()>())不起作用?

为什么以下代码会产生错误?

var listOfList = new List<List<string>>();
var tmp = listOfList.Select(x => x.OrderBy(y => y).Cast<x.GetType()>());
Run Code Online (Sandbox Code Playgroud)

错误:

运算符'<'不能应用于'方法组'和'System.Type'类型的操作数

代码看起来很愚蠢,因为它从我的真实例子中极度简化.我只是想知道为什么它不能正常工作.如果我替换x.getType()List<string>,它可以工作,但我现在不在运行时使用x的类型.
澄清一下:我没有必要寻找解决方案.我想知道我的代码到底出了什么问题.

c# linq select casting typeof

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

依赖属性收到xaml更改时的回调

当我IsClosed在运行时设置值时,OnIsClosedChanged()称为罚款.但是,Designer会设置属性的值,但不会调用OnIsClosedChanged().

public static DependencyProperty IsClosedProperty = DependencyProperty.Register("IsClosed", typeof(bool), typeof(GroupBox), new FrameworkPropertyMetadata(false, FrameworkPropertyMetadataOptions.AffectsRender));

public bool IsClosed {
    get {
        return (bool)this.GetValue(IsClosedProperty);
    }
    set {
        if ((bool)this.GetValue(IsClosedProperty) == value)
            return;

        this.SetValue(IsClosedProperty, value);
        OnIsClosedChanged();
    }
}



private void OnIsClosedChanged() {
    _rowDefContent.Height = new GridLength((IsClosed ? 0 : 1), GridUnitType.Star);
}
Run Code Online (Sandbox Code Playgroud)

显然IsClosed,Designer不会对其进行修改,只会IsClosedProperty接收xaml更改.
我的问题是:如何IsClosed在Designer中修改了值后运行.或者至少为非运行时更改添加一些逻辑.

c# wpf xaml dependency-properties

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

如何在不改变类型的情况下订购IGrouping?

我有一个IGrouping类型的对象,并希望在不改变对象类型的情况下对组内的元素进行排序.
换句话说,我有

var tmp = group.OrderBy(x => x);
Run Code Online (Sandbox Code Playgroud)

group是型的IGrouping<int, someanonymousclass>,我想tmp为类型IGrouping<int, someanonymousclass>为好.

一种解决方法是将其更改为Dictionary或新的匿名类,但我希望tmp特别是类型IGrouping<int, someanonymousclass>.

换句话说:我想对我IGrouping<int, someanonymousclass>对象的元素进行排序.如果我使用OrderBy它改变的类型groupIOrderedEnumerable和我不能访问group.Key了.我怎么能维持这种类型group

例:

var states = SimulationPanel.innerPanel.Children.OfType<StateBar>().Where(x => x.isSensorState())
                .GroupBy(x => (SensorElement)x.BauplanElement,
                         x => new
                         {
                             Start = (decimal)(x.Margin.Left / SimulationPanel.Zoom),
                             Width = (decimal)(x.Width / SimulationPanel.Zoom),
                             State = x.State
                         });

var group = states.First();
var tmp = group.OrderBy(x => x.Start);
var key = tmp.Key;    //This …
Run Code Online (Sandbox Code Playgroud)

c# linq sql-order-by igrouping

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

将表达式中的参数替换为常量

我有一个类型的表达式Expression<Func<TElement, TElement, bool>>和一个类型的常量TElement。我需要一个类型的表达式Expression<Func<TElement, bool>>,其中一个参数被常量替换。换句话说,我需要以下方法的主体:

public static Expression<Func<TElement, bool>> ReplaceParameter<TElement>
(
    Expression<Func<TElement, TElement, bool>> inputExpression,
    TElement element
)
{
    ...
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话ReplaceParameter((i1, i2) => i1 > i2, 5),我预计结果是i => i > 5

我在想,它也许能够递归地解构然后重建输入表达式,并用常量表达式替换所有出现的第二个参数。由于有很多不同的表达方式,我不确定如何做到这一点。

.net c# reflection expression

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

如何使用鼠标滚轮更改滑块的值?

我想将 a 的值更改为Slider鼠标滚轮:当我向上滚动时,Slider's Value属性应该增加,当我向下滚动时,它应该减少。
该行为应该独立于鼠标位置或当前焦点。

解决方案最好使用绑定并且仅是 XAML,但代码隐藏解决方案也足够了。

.net c# wpf slider mousewheel

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