使用PrintDialog从WPF打印时,您只能为要打印的所有页面设置默认页面方向.我正在使用FixedDocument并为我自己布局的不同内容创建多个页面,包括页眉和页脚行.其中一些页面必须是风景,其他页面必须是肖像.
如何设置单个页面的方向?FixedPage类不提供这样的属性.
至少在一个应用程序中,我需要在关系数据库中保留旧版本的记录。当应该更新某些内容时,将添加一个新副本,并将旧行标记为非当前行。当应删除某些内容时,应将其标记为非当前或已删除。
有一个简单的用例:记录的新版本只能在当前时间添加,每个版本取代一行。这可用于在保存新数据时存档以前的记录。为此,我会将以下列添加到每个表中:
VersionTime datetime -- Time when this versions becomes effective
IsCurrent bool -- Indicates whether this version is the most current (and not deleted)
Run Code Online (Sandbox Code Playgroud)
如果您只需要知道记录的最新版本是什么,并且只需要单独枚举单个记录的先前版本,那么这很好。时间点查询比第二种变体更痛苦。
一个更通用的变体是这样的:可以在任何指定的有效时间范围内随时添加记录的版本。所以我可以声明一个实体的某些设置在 2013 年底之前有效,它的另一个版本在 2014 年有效,另一个版本将从 2015 年开始有效。这可用于存档旧数据(如上),并提前计划在未来某个时间使用不同的数据(并将此信息保存为存档)。为此,我会将以下列添加到每个表中:
ValidFrom datetime -- Time when this version becomes valid (inclusive)
ValidTo datetime -- Time when this version becomes invalid (exclusive)
Run Code Online (Sandbox Code Playgroud)
第二种方法基本上也可以代表第一种方法,但很难知道哪个版本是最新的 - 因为您还可以为将来添加版本。此外,ValidFrom/ValidTo 设计能够声明重叠范围,并且根据定义,具有最高 ValidFrom 的行应适用于这种情况。
现在我想知道如何实施有效的解决方案来管理和查询此类数据。通常,您可以使用任何类型的 WHERE、GROUP BY 和 JOIN 编写任何 SQL 查询来获取您想要的记录。但是应用版本控制后,您需要考虑每条记录的正确版本。因此,不是连接来自另一个表的记录的每个版本,而是必须添加适当的条件以仅选择在给定时间有效的版本。
一个例子:
SELECT a, b, c
FROM t1
Run Code Online (Sandbox Code Playgroud)
必须改为:
SELECT a, b, c
FROM …Run Code Online (Sandbox Code Playgroud) 我在用着AesCryptoServiceProvider来加密和解密磁盘上的 XML 文档。MSDN 参考中有一个很有帮助的示例。我根据给定密码的 SHA-256 哈希生成 AES 密钥。它的前半部分被指定为 IV,因为我不知道这里有什么更好的东西可以使用。据我所知,加密和解密时密钥和IV必须相同。
当我解密文件时,它的开头是这样的:
\n\nI\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbdH\xe7\x92\xa7\xef\xbf\xbd-\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd\xef\xbf\xbd[\xef\xbf\xbd="1.0" encoding="utf-8"?>\nRun Code Online (Sandbox Code Playgroud)\n\n该文档的其余部分完全没问题。正如我所期望的那样,内容后面甚至没有一些随机填充。
\n\n是什么导致文件开头出现这种随机垃圾?
\n\n以下是更多阅读代码:
\n\nusing (AesCryptoServiceProvider aes = new AesCryptoServiceProvider())\n{\n using (SHA256CryptoServiceProvider sha = new SHA256CryptoServiceProvider())\n {\n this.cryptoKey = sha.ComputeHash(Encoding.Unicode.GetBytes(password));\n }\n aes.Key = this.cryptoKey;\n Array.Copy(this.cryptoKey, aes.IV, 16);\n\n ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);\n\n using (FileStream fs = new FileStream(fileName, FileMode.Open, FileAccess.Read))\n using (CryptoStream cs = new CryptoStream(fs, decryptor, CryptoStreamMode.Read))\n using (StreamReader sr = new StreamReader(cs))\n {\n string data = sr.ReadToEnd();\n xdoc.LoadXml(data);\n\n //xdoc.Load(sr);\n …Run Code Online (Sandbox Code Playgroud) 我有一个页面在过滤器被激活之前工作正常。footer元素末尾有一个body,设置fixed在视口的底部。现在我需要创建另一个footer具有相同定位的元素。它包含 a 的按钮form,为了使提交按钮起作用,它们必须位于该form元素内。
当页面上打开模式时(这是执行此操作的代码),背景会变暗并被过滤。但是,一旦该过滤器生效,第二个过滤器footer就不再位于视口的底部,而是位于其他页面内容的底部,可以在任何地方。
这是显示问题的示例。只需注释掉过滤器样式即可查看其外观。不同的颜色和高度仅用于说明目的。在我的应用程序中,所有页脚看起来都一样。事实上,我不再使用 footer2 但需要 footer1始终位于 footer2 所在的位置。
body>* {
filter: blur(1px);
}
main {
border: 2px solid #64e315;
}
footer {
position: fixed;
bottom: 0;
left: 0;
right: 0;
padding: 20px;
}
#footer1 {
background: #dce2f8;
}
#footer2 {
border: 2px solid #e38e15;
text-align: center;
}Run Code Online (Sandbox Code Playgroud)
<main>
<p>
Main content
</p>
<p style="height: 150px;">
<!-- Placeholder for fixed footer …Run Code Online (Sandbox Code Playgroud)我需要修改现有代码以支持同步和异步结果。虽然我可以轻松地使用 C# 处理Task和await,但即使在阅读了 MDN 和其他页面的大量内容之后,我还是无法理解 JavaScript Promise。
现有代码如下所示:
function dispatchCall() {
// ...
try {
let result = fn.apply(context, args);
if (result !== undefined) {
return { status: 0, result: result };
}
return { status: 0 };
}
catch (err) {
if (typeof err === "object") {
return { status: 400, errorMessage: err.name + ", " + err.message, stack: err.stack };
}
return { status: 400, errorMessage: err };
}
}
Run Code Online (Sandbox Code Playgroud)
fn是要调用的函数。它是由我的 API …
我的窗口中有一个ListView,它有很多列.部分或全部列不能由用户调整大小,因为它们已经具有最佳宽度,并且意外调整大小只会使其变得更糟.现在有一些问题的答案可用,但所有这些都最终重新设计控件.不幸的是,我最终得到了许多XAML代码页面,这些代码是高度平台/主题特定的.当我使用Blend创建默认样式的副本时,我会获得许多仅适用于Win7 Aero的渐变等,但不适用于XP主题或其他任何内容.
因此,替换控件的整个样式不是一种选择.(它几乎没有.)
我已经确定了需要隐藏的部分,它被命名为"PART_HeaderGripper".我以前做过这样的事情,使用代码隐藏中的以下代码从ProgressBar中删除正在运行的发光和其他部分:
var glow = progressBar.Template.FindName("PART_GlowRect", progressBar) as FrameworkElement;
if (glow != null) glow.Visibility = visibility;
Run Code Online (Sandbox Code Playgroud)
但这不适用于GridViewColumnHeader,因为Template.FindName没有找到任何内容(返回null).我很确定必须有一种方法可以在运行时修改视觉效果.但我现在无法弄明白.任何的想法?
当用户在WPF TextBox中按Insert键时,控件在插入和覆盖模式之间切换.通常,这是通过使用不同的光标(线对块)可视化的,但这不是这里的情况.由于用户完全没有办法知道覆盖模式是活动的,我只想完全禁用它.当用户按下Insert键时(或者可能有意或无意地激活该模式),TextBox应该保持插入模式.
我可以添加一些按键事件处理程序并忽略所有这些事件,按下没有修饰符的Insert键.那就够了吗?你知道一个更好的选择吗?我的视图中有很多TextBox控件,我不想在任何地方添加事件处理程序......
我开始多线程,并想知道什么时候任何的然后完成.我知道以下代码:
foreach (Thread t in threads)
t.Join();
Run Code Online (Sandbox Code Playgroud)
但它只会等待所有线程在一起.那太晚了.我需要知道一个线程何时完成,即使其他线程仍在运行.我正在寻找相当于WaitAny线程的东西.但是我无法将代码添加到我正在监视的所有线程中,因此使用信号或其他同步对象不是一种选择.
一些澄清:我正在开发一个记录/跟踪工具,它应该记录应用程序的活动.我可以在线程启动时插入日志语句,但是我不能在线程的每个可能的方式上插入日志语句(多个退出点,异常等).所以我想注册新线程,然后在完成写入日志条目时收到通知.我可以Join在每个线程上异步,但这意味着每个受监控线程的第二个线程可能看起来有点开销.线程是通过各种方式使用的,是它BackgroundWorker,Task或池中的线程.从本质上讲,它是一个线程,我想知道它什么时候完成.确切的线程机制由应用程序定义,而不是日志记录解决方案.
您可以加载程序集和查询中的所有组件属性,包括AssemblyInformationalVersionAttribute,AssemblyVersionAttribute和AssemblyFileVersionAttribute。但是,仅使用该Assembly.ReflectionOnlyLoadFrom方法打开程序集进行反射时,仅列出信息版本和文件版本,而不列出AssemblyVersionAttribute。
为什么我也没有得到该属性?
正如ILSpy演示的那样,Mono Cecil可以阅读所有内容。但是对于我的特定工具而言,该库太大了。
.NET 的 XPath 函数提供了常用功能,例如SelectSingleNode和SelectNodes。他们只能找到子节点只能查找XPath 查询指定的
但是如果我想测试当前节点是否匹配给定的 XPath 规范怎么办?这是如何运作的?
假设我有一个 HTML 文档,我在其中找到了一个table节点。
<table>
<tr>
<td>...</td>
<tr>
<tr class="abc">
<td>...</td>
</tr>
</table>
Run Code Online (Sandbox Code Playgroud)
我可以tr从那里找到所有元素。一旦我达到了tr元素(我也可以通过导航到达那里,而不是 XPath),我想知道它是否符合某些条件。最好将它们指定为 XPath 字符串。
这就是我正在寻找的:
XmlNode trNode = ...;
bool result = trNode.Matches("tr[@class='abc']");
Run Code Online (Sandbox Code Playgroud)
.NET 的(非常有限的)XPath 功能是否支持此功能?或者,如果这有区别的话,HtmlAgilityPack包?
c# ×3
wpf ×3
.net ×2
attributes ×1
cryptography ×1
css ×1
database ×1
encryption ×1
html ×1
javascript ×1
layout ×1
listview ×1
orientation ×1
overwrite ×1
printing ×1
promise ×1
reflection ×1
resize ×1
sql ×1
textbox ×1
version ×1
xml ×1
xpath ×1