在Winforms表单中,我想在输入字段包含无效值时向用户提供可视提示.为此,我想将ForeColor输入字段标签的属性绑定到IsPropertyValid底层模型的(boolean)属性,以便标签在变为红色时变为红色IsPropertyValid == false.
我目前拥有的是绑定Format事件的事件处理程序:
Controls["dateOfBirthLabel"].DataBindings["ForeColor"].Format += convertBoolToColor;
// (dateOfBirthLabel.ForeColor is bound to a boolean IsDateOfBirthValid property.)
void convertBoolToColor(object sender, ConvertEventArgs e)
{
e.Value = (bool)e.Value ? Color.Black : Color.Red;
}
Run Code Online (Sandbox Code Playgroud)
如果我想在WPF中执行此操作,我想我会直接使用XAML中的绑定指定自定义值转换器(boolto Color).最重要的是,我不必通过其名称来引用特定控件.
我想用Winforms表单做同样的事情.理想情况下,我可以TypeConverter直接在Forms Designer中为特定绑定指定对象.这可能吗?
我们从VS2008改为VS2010进行开发.但是安装应用程序的要求仍然是Framework 3.5.因此,我们将构建目标定位到此框架.一切正常,除了奇怪的行为,我想验证不是一个问题:
如果有人编辑resources.resx和resources.designer.cs中的资源现有条目,请将system.windows.forms条目从2.0.0.0更改为4.0.0.0.例:
编辑前:
<assembly alias="System.windows.forms"
name="system.windows.forms, Version=2.0.0.0, ...[signature] />
Run Code Online (Sandbox Code Playgroud)
后:
<assembly alias="System.windows.forms"
name="system.windows.forms, Version=4.0.0.0, ...[signature] />
Run Code Online (Sandbox Code Playgroud)
这似乎是图片的ResXFileRef类型的参考.一行后来它说:
<data name="mypic" type="System.Resources.ResXFileRef, System.Windows.Forms">
<value>[pictureinfomation - referencing System.Drawing version 2.0]</value>
</data>
Run Code Online (Sandbox Code Playgroud)
运行应用程序似乎没有寻找版本4.但我想知道,这不是一个问题.
有人有什么想法?我已经搜索了相当一段时间的答案,并且不理解ResxFileRef在资源机制中的用法.
如果我的应用程序仍然只使用3.5版本,感谢任何提示.
问候
首先,对于冗长的帖子感到抱歉.基本上,我的问题是:
我试图在C#中重现以下F#区别联合类型:
type Relation =
| LessThan of obj * obj
| EqualTo of obj * obj
| GreaterThan of obj * obj
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议一个比以下更简单的基于接口的解决方案?
interface IRelation // concrete types represent ? in the expression "Subject ? Object"
{
object Subject { get; }
object Object { get; }
}
struct LessThanRelation : IRelation { … }
struct EqualToRelation : IRelation { … }
struct GreaterThanRelation : IRelation { … }
Run Code Online (Sandbox Code Playgroud)
我的所有算法都识别这三种关系类型,而这些只是这些,所以我需要阻止IRelation第三方(即其他程序集)的任何进一步实现.
脚注:对某些人来说,如果我只是在面向对象/多态性方面得到了我的接口和算法,那么可能会出现第三方实现被注入到我的算法方法中并不重要,只要接口是正确实施.这是一个有效的批评.但是,让我们假设,在这种情况下,我倾向于在严格的面向对象上采用更多功能编程风格.
我的最好的办法,到目前为止是宣布所有以上类型的internal(即它们将永远不会被外人直接看到.),并创建一个代理类型Relation,这将是唯一可见的类型的第三方: …
我现在正在使用以下内容:
foreach (string file in files) {
switch (filetype.Value) {
case "ReadFile":
ReadFile(file);
break;
case "ReadMSOfficeWordFile":
ReadMSOfficeWordFile(file);
break;
case "ReadMSOfficeExcelFile":
ReadMSOfficeExcelFile(file);
break;
case "ReadPDFFile":
ReadPDFFile(file);
break;
}
}
Run Code Online (Sandbox Code Playgroud)
它有效,但感觉有点不对劲.Python的方式更像是这样的:
foreach string file in files:
filetype.Value(file)
Run Code Online (Sandbox Code Playgroud)
我很难想象C#不能做这样的事情.可能是我的Google技能不好,但我似乎无法弄明白.
解
public static readonly IDictionary<string, Action<string>> FileTypesDict = new Dictionary<string,Action<string>> {
{"*.txt", ReadFile},
{"*.doc", ReadMSOfficeWordFile},
{"*.docx", ReadMSOfficeWordFile},
{"*.xls", ReadMSOfficeExcelFile},
{"*.xlsx", ReadMSOfficeExcelFile},
{"*.pdf", ReadPDFFile},
};
Run Code Online (Sandbox Code Playgroud)
foreach (KeyValuePair<string, Action<string>> filetype in FileTypesDict) {
string[] files = Directory.GetFiles(FilePath, filetype.Key, SearchOption.AllDirectories);
//System.Reflection.MethodInfo ReadFileMethod = ReadFile.GetType().GetMethod(filetype.Value);
foreach (string …Run Code Online (Sandbox Code Playgroud) 我需要设计一个类,其中一个属性名称必须是return,但是当我创建一个属性名称时,return我得到一个错误.
经过一些研究后,我发现可以通过@在C#中添加前缀或将其括[]在VB.NET的方括号中来使用保留关键字作为属性或变量名.例如:
var @class = new object();
Run Code Online (Sandbox Code Playgroud)
所以这是我的类设计代码.
public class Person
{
string _retVal;
public string @return
{
get { return _retVal; }
set { _retVal = value; }
}
}
...
Person p = new Person();
p.@return = "hello";
Run Code Online (Sandbox Code Playgroud)
现在我没有收到任何错误,但是当我尝试访问属性名称时,return我需要写出类似的名称@return,这是我不想要的.我想要访问属性名称p.return = "hello";而不是p.@return = "hello";所以我想知道是否有任何方法可以做到这一点?
背景:本着"编程接口,而不是实现"和Haskell类型的精神,作为编码实验,我在考虑创建一个主要基于接口和扩展组合的API意味着什么方法.我有两条准则:
尽可能避免类继承.接口应该实现为sealed classes.
(这有两个原因:首先,因为子类化引发了一些关于如何在派生类中指定和强制执行基类'契约的讨厌问题.其次,这就是Haskell类型类的影响,多态不需要子类化.)
尽可能避免使用实例方法.如果可以使用扩展方法完成,则首选这些方法.
(这是为了帮助保持接口紧凑:通过其他实例方法的组合可以完成的所有操作成为扩展方法.接口中剩下的是核心功能,特别是状态改变方法.)
问题:我遇到了第二条准则的问题.考虑一下:
interface IApple { }
static void Eat(this IApple apple)
{
Console.WriteLine("Yummy, that was good!");
}
interface IRottenApple : IApple { }
static void Eat(this IRottenApple apple)
{
Console.WriteLine("Eat it yourself, you disgusting human, you!");
}
sealed class RottenApple : IRottenApple { }
IApple apple = new RottenApple();
// API user might expect virtual dispatch to happen (as usual) when 'Eat' is called:
apple.Eat(); // ==> …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用依赖注入与MVP将所需的依赖项注入构造函数.我遇到的问题是,如果我在根MainWindowPresenter上使用依赖注入,所有它的子演示者及其子演示者,视图和服务都将在启动时加载.由于所有内容都是直接或间接从MainWindowPresenter加载的,这意味着整个应用程序将在启动时加载到内存中.
我知道在.NET中创建所有对象在启动时可能不会花费很多,但我不禁认为这是浪费内存,因为它们永远不会同时被使用.有一些像AboutPresenter或HelpPresenter可能永远不会被使用.我错过了或者这是依赖注入应该如何工作?有没有解决的办法?
我能找到解决这个问题的唯一方法是使用工厂,然后可以在需要时创建子演示者/视图/服务.例如:
class HelpFactory : AbstractHelpFactory
{
public IHelpPresenter Create()
{
IHelpService helpService = new ConcreteHelpService();
IHelpView helpView = new ConcreteHelpView();
HelpSearchPresenter searchPresenter = HelpSearchFactory.Create();
return HelpPresenter(helpView, helpService, searchPresenter);
}
}
Run Code Online (Sandbox Code Playgroud)
这与工厂当时依赖于子工厂基本相同,但至少它们比演示者/视图/服务更轻,并且他们不需要在需要之前加载子工厂.
出于好奇,我试图在.NET 3.5 Client Profile下编译一些简单async/ await代码:
async void AwaitFoo()
{
await new Foo();
}
class Foo
{
public IFooAwaiter GetAwaiter() { … }
}
interface IFooAwaiter : System.Runtime.CompilerServices.INotifyCompletion
{
bool IsCompleted { get; }
void GetResult();
}
Run Code Online (Sandbox Code Playgroud)
我完全清楚.NET 3.5不支持这种语言功能,正如此编译错误所表达的那样:
找不到
async修改器所需的所有类型.您是否针对错误的框架版本,或缺少对程序集的引用?
我也知道NuGet包Microsoft.Bcl.Async,它不支持.NET 3.5.
问题:编译代码所需async的最小类型和类型成员是什么?这个最小集是否正式记录; 如果是的话,在哪里?(请注意,我只对成功编译感兴趣,而不是执行.)
到目前为止我得到了什么:
我一直试图通过实验找到这个最小的类型集,这似乎是可能的,因为编译器需要报告,但是逐个丢失类型:
System.Runtime.CompilerServices.IAsyncStateMachine未定义或导入预定义类型.
根据MSDN参考页面定义报告的类型,然后导致报告下一个丢失的类型.我到目前为止:
System.Runtime.CompilerServices.IAsyncStateMachineSystem.Runtime.CompilerServices.INotifyCompletion (上面的示例代码所要求的)System.Threading.Tasks.CancellationToken(要求Task)System.Threading.Tasks.TaskCreationOptions(要求Task)System.Threading.Tasks.Task此时我停了下来,因为Task有很多成员,但是编译器没有准确报告它需要哪些成员; 它只是报告整体类型.因此,我可能会重现比实际需要更多的类型定义.
在研究 Direct2D 支持哪些 COM 单元线程模型时,我发现尽管外观和事实可以使用来自 .NET 的 API 使用 COM 互操作性,但Direct2D(与其他 DirectX API 一样)实际上根本不是 COM API。(1)无论是维基百科上的Direct2D文章(2) ,以及一个由托马斯·奥尔森MSDN博客文章(3)指的是使用一个“轻量级COM”的方式这些API。
但是,我还没有找到关于这个“轻量级 COM”究竟是什么的任何官方定义。有没有这样的定义(可能是微软)?
Mike Danes 对 MSDN 论坛问题“CoInitialize/CoUninitialize,Direct2D 和 DirectWrite 真的需要它们吗?”的回答 . 这是有趣的一点:
“DirectWrite/Direct2D/Direct3D 是 COM 之类的 API,但它们不使用 COM。它们不像普通的 COM 组件那样在注册表中注册,它们不遵循 COM 线程模型,它们不支持任何类型的编组等。它们”不是 COM。”
“Direct2D 是一种基于 C++ 的本机代码 API,可由托管代码调用,并使用类似于 Direct3D 的“轻量级 COM”方法,具有最少的抽象。”
Thomas Olsen 的 MSDN 博客文章提到以下作为 Direct2D 的设计目标:
“轻量级 COM——应该使用 C++ 风格的接口来模拟 Direct3D 的使用。不支持代理、跨进程远程处理、BSTR、VARIANT、COM 注册(例如重量级的东西)。”
我是一名新开发人员,我很难找到能够清楚地识别Polyfill和Polymer之间差异的任何东西.
我很确定Polyfill是/或使用platform.js webcomponents.js的一部分,而webcomponents.js反过来又是大多数浏览器用来确保Web组件尚未完全支持的用途的一部分.而Polymer使用某种形式的模板,如Angular的指令,但它似乎是未来网络的一个更永久的固定装置.
任何人都可以提供更明确的定义或链接,以阐明两者之间的差异吗?
c# ×7
.net ×5
interface ×2
.net-3.5 ×1
api-design ×1
async-await ×1
com ×1
com-interop ×1
data-binding ×1
direct2d ×1
direct3d ×1
f# ×1
keyword ×1
mvp ×1
polyfills ×1
polymer ×1
reserved ×1
resources ×1
winforms ×1