您通常看不到这些文件,因为它们隐藏在项目树中,您只能通过可视化设计器编辑 Windows 窗体 .NET 应用程序的 GUI。但是当使用某种 SCM(版本控制)时,当这些文件一直发生显着变化时,这是一个巨大的 PITA。即使我在设计器中没有触及任何东西而只是重建解决方案甚至在 VS 中打开它,许多代码行也会移动到文件中的另一个位置。这总是会产生一个没人能解释甚至分析的变化集。
有没有办法阻止 Visual Studio 这样做?我在 2010 年之前的每个版本中都看到了它。我认为 WPF XAML 文件不应受此影响,但 WPF 不是此处的选项。
我有一个1-Wire USB适配器(蓝色的那个),并希望从一个小型Linux机箱中使用它来监控温度.Linux盒子现在已经无序了,所以在此期间我想在我的Windows桌面上使用基于.NET的监控软件来记录温度.但似乎并没有一个可用的.NET .NET库.Maxim SDK附带的那个需要J#,我没有并且想要使用它.我甚至不确定我是否可以在基于.NET 4.0的应用程序中使用它,因为J#已经停止使用AFAIK.SourceForge(owdotnet)上的另一个"开源工作"是在2008年,看起来已经死了.甚至没有关于它的任何信息页面.Maxim的SDK还带有一个"紧凑型.NET"版本,至少可以找到连接到适配器的设备,但我需要实现整个1-Wire协议本人似乎(发送原始字节,等待一小会儿,那种东西).所以这对现在没什么帮助.谷歌没有找到任何其他东西.你呢?
我的印象是整个1-Wire的东西已经死了.它只能在Linux系统上使用(使用owfs,编译起来很庞大),整个产品生态系统并不完全活跃.还有哪些其他解决方案可以测量温度,环境参数(湿度,水,压力等)和状态(如打开的门),甚至可以切换不需要花钱的东西(打开和关闭灯)(和"家庭自动化"一样)?并且最好也可以从.NET代码访问?
我是 MVVM(和一些 WPF)的新手,最近几天我阅读了许多代码项目文章、博客文章和 Stackoverflow 问题。我的印象是数据绑定非常适合显示从数据源(数据库)加载后的数据,并使模型与视图保持同步,同时更新视图中模型数据的所有其他外观。
但我仍然不知道如何保存,在验证之前,应该如何正常工作。我有很强的 Windows 窗体和 ADO.NET 背景。我非常熟悉数据库访问层和视图更新的编码。那时,您只有在视图中进行编辑的临时临时数据,以及模型类和数据库中数据的最后保存版本。模型类通常与数据库同步。该视图包含尚未保存的数据。
您还有一个 Save 按钮,可以从控件中读取所有数据,在代码中对其进行验证,然后接受并将其保存到模型和数据库中,或者不更新模型并显示错误消息。如果出现错误,用户输入会保留在 UI 中,供用户更正。但是应用程序的其他部分都看不到它。并且您有一个取消按钮,它只会丢弃包含编辑控件的视图部分 - 模型仍然有效且未更改。
现在有了数据绑定和 ViewModels 只暴露来自 Model 类的数据,在 TextBox 中输入的内容会立即进入模型,无论正确与否。IDataErrorInfo 仅此而已 - 信息。你可以认为它或忽略它。唯一强制执行的硬验证是类型转换:您永远不能将非数字字符串更新为数字模型字段。但仅此而已。我将通过让 ViewModel 进行所有验证并从属性设置器对无效数据抛出异常来解决这个问题。这是实现已知行为的唯一方法。
但是数据的保存和丢弃去哪里了呢?我什么时候才能真正将数据写回数据库?每次离开 TextBox 是否都会导致数据库写入,以便我不再需要显式保存命令(并且只能通过撤消恢复)?我什么时候会验证整个数据记录?我将如何处理模型和数据库不同步,由于数据绑定,无效输入立即传播到整个应用程序和所有视图?何时以及如何使用“取消”按钮丢弃任何用户输入,保持模型不变 - 或将其恢复到打开该编辑器对话框之前的状态?
我觉得 MVVM 没有为这些基本问题提供解决方案。我只是想念他们还是他们真的不存在?如果 MVVM 不是解决此问题的方法,那么什么是?或者 MVVM 最好不要用于 WPF 中的数据编辑应用程序?
在我的 WPF 控件中,我有以下两个触发器:
<Trigger
Property="Controls:TreeViewExItem.IsMouseOver"
Value="True"
SourceName="ElementGrid">
Run Code Online (Sandbox Code Playgroud)
和
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="False">
Run Code Online (Sandbox Code Playgroud)
两者本身都工作得很好。但我需要这些的结合。我试过这个:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="True"/>
<Condition
Binding="{Binding
(Controls:TreeViewExItem.IsMouseOver),
Source=ElementGrid}"
Value="True"/>
</MultiDataTrigger.Conditions>
Run Code Online (Sandbox Code Playgroud)
但它什么也没做。我在输出窗口中收到此消息:
System.Windows.Data 错误:17:无法从“”(类型“字符串”)获取“IsMouseOver”值(类型“布尔”)。绑定表达式:路径=(0); DataItem='字符串' (HashCode=1047858601); 目标元素是 'TreeViewExItem' (Name=''); 目标属性为“NoTarget”(类型“Object”) InvalidCastException:“System.InvalidCastException:Das Objekt des Typs“System.String”可以在 Typ“System.Windows.DependencyObject”umgewandelt werden 中使用。
这并没有告诉我任何事情。它将如何运作?
更新:完整的项目代码现在可以在我的 GitHub 存储库中查看。我对 MultiDataTrigger 的猜测当前位于。
我的DataGrid分配了一个ContextMenu,其中包含对所选行执行某些操作的命令.这已经很好了.
问题是,每次打开ContextMenu时(通过鼠标右键或菜单键),DataGrid都会失去焦点,所选行会将其背景颜色从蓝色变为浅灰色.这是一个很大的对比,用户会得到清除选择的印象,并且不确定上下文菜单是否为正确的行打开.
颜色变化非常好,非聚焦项目不应该有焦点颜色.但打开上下文菜单不应该触发它.
这是一些XAML代码:
<DataGrid
HeadersVisibility="Column"
HorizontalGridLinesBrush="#cccccc" VerticalGridLinesBrush="#cccccc"
BorderBrush="#cccccc" Background="{x:Null}"
CanUserReorderColumns="False" IsReadOnly="True"
ItemsSource="{Binding MyItems, NotifyOnTargetUpdated=True}"
AutoGenerateColumns="False"
SelectionChanged="DataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTextColumn .../>
<DataGridTextColumn .../>
<DataGridTextColumn .../>
</DataGrid.Columns>
<DataGrid.ContextMenu>
<ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}">
<MenuItem Header="Command text" Command="{Binding MyCommand}"/>
</ContextMenu>
</DataGrid.ContextMenu>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
以及该问题的带注释的屏幕截图:
我该如何解决这个问题?
最近,我发现了一种方法,该方法执行调度程序队列中的所有待处理消息,直到指定优先级为止。我之前已经有这样的代码,但是它们使用完全不同的方法。这两个都是:
PushFrame方式:
/// <summary>
/// Enters the message loop to process all pending messages down to the specified
/// priority. This method returns after all messages have been processed.
/// </summary>
/// <param name="priority">Minimum priority of the messages to process.</param>
public static void DoEvents(
DispatcherPriority priority = DispatcherPriority.Background)
{
DispatcherFrame frame = new DispatcherFrame();
Dispatcher.CurrentDispatcher.BeginInvoke(
priority,
new DispatcherOperationCallback(ExitFrame), frame);
Dispatcher.PushFrame(frame);
}
private static object ExitFrame(object f)
{
((DispatcherFrame) f).Continue = false;
return null;
}
Run Code Online (Sandbox Code Playgroud)
来源:MSDN库
阻止调用方式:
private static Action …
Run Code Online (Sandbox Code Playgroud) 在DbSet
实体框架(6.1.3)的实体集合中,当我添加新项目时,之后不会从集合中返回它.这很奇怪也很意外.以下是一些收集的示例代码:
dbContext.Entities.ToArray();
// contains 3 entries
dbContext.Entities.Add(new Entity());
dbContext.Entities.ToArray();
// still contains 3 entries
Run Code Online (Sandbox Code Playgroud)
怎么会这样?当我dbContext.Entities
在Visual Studio的即时窗口中查询时,它会显示"Local:Count = 4"之类的内容.为什么它会隐藏我的新物品?
更新:如果此集合没有做明显的事情 - 返回之前添加的内容 - 我需要做什么呢?它必须在首次调用时返回数据库中的所有记录,并且在以后调用时还必须包括所有更改(添加和删除).SaveChanges
仅在用户完成编辑后调用.之前需要收藏!SaveChanges
也可以在用户完成编辑之间的某处调用,但代码可能会返回,并且稍后会再次显示视图.
我的自定义 MSBuild 任务在实际构建之前和之后执行一些步骤。始终执行构建后的步骤来清理一些文件是至关重要的。我目前定义了两个目标:
<Target Name="NrtPatchAssemblyInfo" BeforeTargets="BeforeBuild">
Run Code Online (Sandbox Code Playgroud)
和
<Target Name="NrtRestoreAssemblyInfo" AfterTargets="AfterBuild">
Run Code Online (Sandbox Code Playgroud)
第一个总是执行,但第二个仅在成功构建后运行。如果编译器构建失败(例如由于代码文件中的语法错误),则不会运行第二个目标。
我可以做什么来改变这个并始终执行第二个任务?
我找不到 MSBuild 通常使用的目标名称列表。这些名称只是从其他来源复制的。
在我的 ASP.NET Core 3.1 应用程序中,Startup 类中有这样的代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseStatusCodePagesWithReExecute("/error/{0}");
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/error/500");
app.UseHsts();
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
ErrorController 有一个像这样的操作:
public IActionResult Index(int id)
{
var context = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
var exception = context?.Error;
if (exception != null)
{
logger.LogCritical(exception, $"Unhandled exception in request {HttpContext.TraceIdentifier}: {exception.GetRecursiveMessage()}");
}
else
{
logger.LogCritical(exception, $"Unhandled exception in request {HttpContext.TraceIdentifier}, no exception available");
}
// ...
}
Run Code Online (Sandbox Code Playgroud)
根据我所读到的内容,这应该给我在另一个操作中发生的未处理的异常。但事实并非如此。异常对象为空。我还尝试使用类型的其他功能IExceptionHandlerFeature
,但它是一样的。任何地方都不例外。
如何在错误处理程序中获取异常?
请注意,我正在使用重新执行功能,因为我讨厌在出现错误时将用户转发到不同的 URL。这只会使事情变得更糟,因为重新加载页面以“重试”肯定永远不会解决任何问题(这是错误页面,毕竟,它只能显示错误)。
我想将 PowerShell 脚本包装到一个批处理文件中,最终使其对任何人都可以执行,并且可以在单个分布式文件中执行。我的想法是使用读取文件本身的 CMD 命令开始一个文件,跳过前几行并将其余行通过管道传输到 powershell,然后让批处理文件结束。在 Bash 中,使用简短的可读命令将是一项简单的任务,但是您可以从众多技巧中看出 Windows 已经在这方面遇到了大麻烦。这就是它的样子:
@echo off
(for /f "skip=4 delims=" %%a in ('type %0') do @echo.%%a) |powershell -noprofile -noninteractive -
goto :EOF
---------- BEGIN POWERSHELL ----------
write-host "Hello PowerShell!"
if ($true)
{
write-host "TRUE"
}
write-host "Good bye."
Run Code Online (Sandbox Code Playgroud)
问题是,PowerShell 脚本没有完全执行,它在第一行写完后停止。我可以让它工作更多,这取决于脚本本身,但在这里找不到任何模式。
如果您将第 2 行的结果通过管道传输到文件或cat
进程(如果您安装了 unix 工具,Windows 甚至无法单独执行此操作),您可以看到文件的完整 PowerShell 部分,因此不会被剪切关什么的。PowerShell 只是不想在这里执行脚本。
复制文件,删除前 4 行并将其重命名为 *.ps1,然后调用:
powershell -ExecutionPolicy unrestricted -File FILENAME.ps1
Run Code Online (Sandbox Code Playgroud)
它会完全执行。所以它也不是 PowerShell 脚本内容。在这种情况下,是什么让 powershell 过早结束?
wpf ×4
.net ×3
c# ×3
1wire ×1
asp.net-core ×1
batch-file ×1
cmd ×1
contextmenu ×1
database ×1
datagrid ×1
dispatcher ×1
focus ×1
msbuild ×1
mvvm ×1
powershell ×1
triggers ×1
windows ×1
xaml ×1