考虑我的第一次尝试,F#中的一个简单类型,如下所示:
type Test() =
inherit BaseImplementingNotifyPropertyChangedViaOnPropertyChanged()
let mutable prop: string = null
member this.Prop
with public get() = prop
and public set value =
match value with
| _ when value = prop -> ()
| _ ->
let prop = value
this.OnPropertyChanged("Prop")
Run Code Online (Sandbox Code Playgroud)
现在我通过C#测试它(这个对象正在暴露给C#项目,因此需要明显的C#语义):
[TestMethod]
public void TaskMaster_Test()
{
var target = new FTest();
string propName = null;
target.PropertyChanged += (s, a) => propName = a.PropertyName;
target.Prop = "newString";
Assert.AreEqual("Prop", propName);
Assert.AreEqual("newString", target.Prop);
return;
}
Run Code Online (Sandbox Code Playgroud)
propName
如果分配正确,我的F#Setter正在运行,但第二个断言失败,因为底层值prop
没有改变.这种方式对我来说很有意义,因为如果我mutable …
我最近发现了IsolatedStorage
.net中的设施,我想知道何时应该将它们用于我的应用程序数据,而不是我应该使用它(例如)Application.LocalUserAppDataPath
.
我注意到的一件事是Application
在winforms应用程序之外不存在,所以IsolatedStorage
对于需要某些特定存储的类库来说似乎有意义,特别是如果该库可能被Web应用程序和winforms app.这是唯一的区别点,还是还有更多呢?
(作为一项规则,直到现在,我已经让应用程序在库可能需要某种外部存储时向库提供文件流 - 一般来说,我不喜欢库的想法调用者上下文外部的某种状态.)
我正在尝试在 .net 中设置基本日志记录到 .net 中的 Windows 事件日志System.Diagnostics.EventLog
,但我没有看到任何实际写入日志的事件。考虑以下代码:
// Elsewhere in the class
private static readonly string EventLogName = "LogName";
private static readonly string EventLogSource = "AppName";
// In the only function that does something
if (!EventLog.Exists(EventLogName))
{
EventLog.CreateEventSource(EventLogSource, EventLogName);
return;
}
else
{
Trace.TraceInformation("Attempting log");
// This doesn't write anything
EventLog.WriteEntry(EventLogSource,
"StaticWriteEntry",
EventLogEntryType.Error);
// Neither does this
using (var log = new EventLog())
{
log.Log = EventLogName;
log.Source = EventLogSource;
log.WriteEntry("WriteEntry?", EventLogEntryType.Error);
}
}
return;
Run Code Online (Sandbox Code Playgroud)
根据 MSDN 示例,我第一次创建日志并退出应用程序。当然,此日志创建最终将进入设置。后续运行尝试将消息记录到创建的事件日志中。 …
我在Microsoft Sql CE中创建了一个表,用于保存一些数据.我已经通过SqlMetal生成了一个ORM,并且我将数据源拉入了我的WPF项目.
我想创建一个简单的WPF表单,可以通过ORM生成的类来编辑表中的记录.我希望这个表单支持典型的OK/Cancel语义.我已经在我认为是典型的时尚中创建了表单,在相应的字段上使用TwoWay数据绑定来绑定来自ORM的对象的实例.例如,给定ORM中具有属性"TaskName"的对象,我在WPF表单中包含以下内容:
<Label Grid.Column="0" Grid.Row="0" >
Name:
</Label>
<TextBox Name="txtName" Grid.Column="1" Grid.Row="0"
Text="{Binding TaskName, Mode=TwoWay}" AcceptsReturn="False"
MaxLines="1" />
Run Code Online (Sandbox Code Playgroud)
这与代码中的DataContext赋值相结合:
var newRow = new OrmGeneratedClass();
// Populate default values on newRow, e.g.
detailWindow.DataContext = newRow;
detailWindow.ShowDialog();
Run Code Online (Sandbox Code Playgroud)
可以合理地创建新行.通过表单进行的所有更改都会立即反映在底层的OrmGeneratedClass中.问题是,如果例如OrmGeneratedClass填充了先前保存的值,则不会立即支持取消更改.
对于这种情况,什么是好的设计,或者在我达到这一点之前我是否设计错了? 我是WPF和Sql Server数据源/ ORM集成方面的新手.(这是我用来学习这两种技术的个人项目.)
我有几个想法,并将他们放在答案中
我ColorDialog
在WinForms中启动一个组件,让用户选择一个特定的自定义控件的图表的背景颜色和前景色.两个配置选项都在配置对话框的同一页面上,因此我想在对话框启动时将颜色对话框的标题设置为"背景颜色"以更改图表的背景,并将"网格颜色"设置为更改颜色的网格.这将提供一个有用的用户体验,如果用户不确定他们是否选择更改背景或网格颜色,他们将能够查看图表的标题.
不幸的是,文档似乎没有提到任何操纵ColorDialog
标题的方法.是否可以进行此更改?如果是这样,怎么样?
我正在FilteredTextBox
WPF 中创建一个子类化包含的TextBox
控件。该FilteredTextBox
范围内必须只允许字符[a-zA-Z0-9_]
来输入,我已经得到了部分相当多的工作。我已经开始OnPreviewTextInput
处理键入的字符,OnPreviewDrop
过滤拖放的字符,并且我添加了一个 PreviewExecutedHandler,只要在控件上执行命令来处理粘贴,它就会运行。
到现在为止还挺好。
棘手的部分是控件还应该在输入时用下划线替换空格。
我想出了一个解决方案,但感觉很糟糕,我不知道它缺少什么。我觉得必须有一种我不知道的更好的技术。我所做的:
internal class FilteredTextBox : TextBox
{
public FilteredTextBox()
{
CommandManager.AddPreviewExecutedHandler(this, this.HandlePreviewExecuteHandler);
}
private void HandlePreviewExecuteHandler(object sender, ExecutedRoutedEventArgs e)
{
var uiCmd = e.Command as RoutedUICommand;
if (uiCmd != null && (uiCmd.Text == "Space" || uiCmd.Text == "ShiftSpace"))
{
// We're manually handling spaces, so we need to make appropriate checks.
if (this.Text.Length == this.MaxLength) return;
if (this.SelectionLength == 0)
{
// If …
Run Code Online (Sandbox Code Playgroud) 我即将开始研究针对内部客户的ClickOnce应用程序,以便在组织的Intranet上使用.我想简化设置过程,所以我认为开发部分信任的应用程序是个好主意,但现在我不太确定.
用户特别要求的一件事是(归结为)a TextBox
与Cue Text.目前提供此功能的最简单方法是使用一个简单的子类,TextBox
其中包含CueText功能作为属性.cuetext功能是通过PInvoke'd调用完成的SendMessage()
.
protected override void OnHandleCreated(EventArgs e)
{
this.UpdateCueText(); // Bang, you're dead here
base.OnHandleCreated(e);
}
private void UpdateCueText()
{
if (this.IsHandleCreated)
{
NativeMethods.SendMessage(new HandleRef(this, this.Handle), setCueBannerMessage, this.showCueTextWithFocus ? new IntPtr(1) : IntPtr.Zero, this.cueText);
}
}
Run Code Online (Sandbox Code Playgroud)
"啊哈!我需要SecurityPermission.UnmanagedCode
." 默认的Intranet区域安全性包括SecurityPermission
我可以告诉的权限,所以我尝试运行它,它会在调用时爆炸UpdateCueText()
.我甚至可以检查SecurityException
b/c 上的属性,每次尝试评估一个SecurityException
属性都会引发另一个无法察觉的属性SecurityException
.
我尝试标准修改:
protected override void OnHandleCreated(EventArgs e)
{
var permission = new SecurityPermission(SecurityPermissionFlag.UnmanagedCode);
permission.Assert();
try
{
this.UpdateCue();
}
finally
{
CodeAccessPermission.RevertAssert();
}
base.OnHandleCreated(e); …
Run Code Online (Sandbox Code Playgroud) 尝试
{
throw new Exception("test");
}
finally
{
//检查异常????
//日志(例外);
}
有没有办法从最终的运行时中获取异常?
我不能用捕获物:-)
谢谢你的回答.
我不能使用catch,因为它实际上不是我的代码(重构).
我们想要包装一段代码:
using(CriticalFlow(policy))
{
//Not my code.
flow.Succeeded();
}
Run Code Online (Sandbox Code Playgroud)
在CriticalFlow finally块中,我们需要检查异常,如果没有调用成功,则以任何方式提醒任何人.
我希望它能为原来的问题提供一些启示.
再次感谢.
在这里和网上进行了一些搜索并且还没有找到一个好的答案.我要做的是在C#中的同一个类中调用两次按钮.
这是我的情景 -
我有一个带有"Go"按钮的表单.当我第一次点击它时,它会通过一些'for'循环(不停)来显示颜色范围.同时我将button1.Text属性设置为"Stop".我希望能够第二次点击按钮,当发生这种情况时,我希望程序停止.基本上是一个走走停停的按钮.我知道如何使用2个按钮事件,但想使用1个按钮.
现在,结束程序的唯一方法是表单上的X按钮.
我尝试了不同的东西,到目前为止没有太多运气,所以想问这里的大师如何做到这一点.
顺便说一句,这是Head First Labs C#书籍练习的修改.
谢谢!
〜艾伦
我正在读取一个文件,该文件存在于通用窗口应用程序范围中,从一个外部项目添加为.dll到第一个.代码似乎在GetFileAsync中卡住或挂起.此外,当我从应用程序而不是.dll项目运行相同的存根时,它可以工作.我需要知道是否有一种不同的方法从.dll项目中读取Application文件夹中的文件,以便在同一个项目中使用.读取文件的代码:
private static async Task<Stream> getStreamAsync()
{
try
{
StorageFolder storageFolder = Package.Current.InstalledLocation;
StorageFile file = await storageFolder.GetFileAsync("file.json");
Stream stream = null;
if (file != null)
{
var randomAccessStream = await file.OpenReadAsync().AsTask().ConfigureAwait(false);
stream = randomAccessStream.AsStreamForRead();
}
return stream;
}
catch (Exception ex)
{ }
}
private Stream fetchStream()
{
var stream = getStreamAsync().Result;
return stream;
}
private func()
{
Stream StreamFetched = fetchStream();
}
Run Code Online (Sandbox Code Playgroud) .net ×4
c# ×4
winforms ×2
wpf ×2
appdata ×1
async-await ×1
clickonce ×1
colordialog ×1
data-binding ×1
event-log ×1
exception ×1
f# ×1
let-binding ×1
linq-to-sql ×1
mutable ×1
pinvoke ×1
textbox ×1
uwp ×1
wpf-controls ×1