我想构建一个用户界面,由于历史原因,它有很多"列"信息.其中许多在所有情况下都与所有用户无关,所以我想我会看到停靠面板,以允许用户根据他们的工作场景隐藏或重新排列列.
这是.NET 3.5中的Winforms.
因此,我想要以下内容:
示例样机http://images.vkarlsen.no/so/2902953/dock-test.png
到目前为止,我已经尝试了以下组件包,没有运气:
Telerik的
允许我停靠在标签页内,但停靠面板无法从一个标签页移动到另一个标签页.当尝试将浮动面板拖放到与其来源不同的选项卡页面上时,它会显示停靠栏将成功,但是当它被丢弃时,它将停靠在其所有者容器上.
Divelements SandDoc
与Telerik相同的问题.
DevExpress XtraBars
与Telerik相同的问题.
http://sourceforge.net/projects/dockpanelsuite/
同样的问题,停靠站内容窗口只能属于一个停靠面板,这意味着它无法从一个选项卡迁移到另一个选项卡.
基本上,有没有人知道任何这样的组件(包)可以让我做我想要的?
编辑:好的,我试过让Sourceforge控件在上面工作,但我看不出如何使这个工作.
基本上,这就是我需要做的事情:
如果我理解下面的答案提到这个控件,我应该使用DockPanel而不是TabControl,而DockPane而不是TabPage,但据我所知,这只能让我能够停靠和取消选项卡页面,而这不是我想要的是.
无论如何,这是一个程序文件,只需创建一个Winforms项目,从sourceforge项目添加对.dll的引用,并在Program.cs中粘贴此代码:
using System;
using System.Windows.Forms;
using WeifenLuo.WinFormsUI.Docking;
namespace DockTest
{
public class DockWindow1 : DockContent
{
public DockWindow1()
{
TabText = "Dock-window #1";
DockPanel panel = new DockPanel();
panel.Dock = DockStyle.Fill;
Controls.Add(panel);
// tried this related to the exceptions
// this.DockPanel = panel;
}
}
public class DockWindow2 : DockContent
{
public DockWindow2() …Run Code Online (Sandbox Code Playgroud) 我正在尝试在C#中使用Reflection.Emit来发出一个using (x) { ... }块.
在我处于代码中的时候,我需要获取堆栈的当前顶部,这是一个实现IDisposable的对象,将其存储在局部变量中,在该变量上实现一个使用块,然后在其中添加更多代码(我可以处理最后一部分.)
这是我尝试编译并在Reflector中查看的C#代码示例:
public void Test()
{
TestDisposable disposable = new TestDisposable();
using (disposable)
{
throw new Exception("Test");
}
}
Run Code Online (Sandbox Code Playgroud)
这在Reflector中看起来像这样:
.method public hidebysig instance void Test() cil managed
{
.maxstack 2
.locals init (
[0] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable disposable,
[1] class LVK.Reflection.Tests.UsingConstructTests/TestDisposable CS$3$0000,
[2] bool CS$4$0001)
L_0000: nop
L_0001: newobj instance void LVK.Reflection.Tests.UsingConstructTests/TestDisposable::.ctor()
L_0006: stloc.0
L_0007: ldloc.0
L_0008: stloc.1
L_0009: nop
L_000a: ldstr "Test"
L_000f: newobj instance void [mscorlib]System.Exception::.ctor(string)
L_0014: throw
L_0015: ldloc.1
L_0016: …Run Code Online (Sandbox Code Playgroud) 澄清:问题是:我如何找到Mercurial命令行客户端.如果答案适用于任何可执行文件,那就更好了,但我真的对hg.exe可执行文件感兴趣.
如果我知道可执行文件的名称,比如hg.exeMercurial命令行客户端,并且Windows知道它的位置,因为我只能hg log从命令提示符执行它并执行,为了让我自己找到该可执行文件,涉及哪些步骤,以与命令提示符和Windows相同的方式执行此操作?
基本上,如果Windows能够找到它,我希望我的程序能够找到它.
是否有WinAPI功能或类似功能?代码将在.NET中运行,用C#编写,所以如果.NET中有任何内置的东西,那将是首选的解决方案,但除此之外,我不会对此使用P/Invoke不利.
我已经看到了这个问题的一个潜在重复:c#检查Windows路径中是否存在可执行文件,但是它是否存在?只是遍历PATH环境变量的内容并在每个目录中查找可执行文件?
我有一个模糊的概念,那只是所涉及的步骤之一,并且可能存在Windows可以使用的注册表覆盖,我应该知道,所以我将在这里发布问题.
另一方面,如果这里只有PATH变量,它可以安全地作为副本关闭.
我工作的公司在Delphi中开发了一个系统,它包含许多exe模块,如果涉及源代码,它们在某种程度上是相同的.遗憾的是,没有人关心使用库来共享代码.这意味着每次在代码中都有错误修复所有这些模块共享时,程序员必须分别对所有这些模块进行修正!它总是需要这么多时间......
我决定找到一种方法将共享代码放入库中.我考虑过DLL和BPL.在这种情况下,BPL似乎更方便程序员,更不麻烦,特别是代码仅在我们的软件中使用,并且仅在Delphi中使用.
我将所有exe模块共享的所有代码放入BPL中,一切看起来都很好,但有些事我不明白,如果你向我解释,我将不胜感激.
在将代码划分为BPL之后我的期望是,使用我创建的BPL部署exe文件就足够了.但事实证明他们也需要一个rtl100.bpl和vcl100.bpl.为什么会这样?我想只部署exes和我的BPL.我不想为最终用户提供由Borland和第三方公司提供的一大堆库:).我希望它们在exes中编译,就像之前编译的那样.有可能吗?
到目前为止我做的是:
如果涉及到exe项目:
这就是我所做的一切.exe项目编译正确,但我无法访问BPL的源代码(我无法从我的exe项目导航到该代码),即使所有BPL与其源代码文件一起存储.为什么?这对我来说似乎很奇怪.
我总是倾向于写冗长的描述 - 抱歉:).我将感谢你的帮助.我只需要对我提到的要点进行一些解释:仅使用我的BPL部署exe,我作为一个整体做的正确性,以及无法导航到BPL源代码.非常感谢你提前!
谢谢大家的讨论.有人说我选择的方法并不是一个好主意.我们的软件包含100多个模块(大多数模块类似于不同设备的驱动程序).他们中的大多数共享相同的代码 - 在大多数情况下是类.问题是这些类并不总是放在单独的独立的pas单元中.我的意思是共享代码通常放在包含特定于模块的代码的单元中.这意味着当您修复共享类中的错误时,仅将定义的pas单元复制到所有软件模块并重新编译它们是不够的.不幸的是,您必须将固定的代码片段逐个复制并粘贴到每个模块中,并将其粘贴到适当的单元和类中.这需要花费很多时间,这是我想要消除的,选择正确的方法 - 请帮助我.
我认为使用BPL是一个很好的解决方案,但它有一些缺点,正如你们有些人提到的那样.最糟糕的问题是,如果每个EXE需要几个BPL,我们的技术支持人员将不得不知道哪个EXE需要哪个BPL,然后为最终用户提供适当的文件.只要我们没有软件更新程序,这对我们的技术人员和最终用户来说都是一个很大的优势.他们肯定会迷茫和愤怒: - /.
兼容性问题也可能发生 - 如果一个BPL由许多EXE共享,一个BPL的修改对于一个EXE是好的而对另一个也是坏的 - @Warren P.
那么我应该怎么做才能在这么多项目中更快地修复错误?我想到了以下方法之一.如果您有更好的想法,请告诉我.
只要修改了后面修改的代码,这个解决方案似乎就可以了.但是我们也有具有一般使用功能和程序的通行单元,这通常是不可修改的 - 我们在必要时在那里添加新功能,但是在单个项目中.因此,假设您在100个模块中的一个模块中编写了一个新函数,并将其放入其通用单元中.一两个月之后,您修改了一个不同的模块,您认为您需要在2个月前编写的相同功能.您必须找到该模块(如果您不记得它是哪个模块很困难)并将该功能复制到您的代码中.显然 - 只要每个模块中的一般使用单元分别存储在每个模块中,它们就会完全不同.然后,如果有一个错误修复要做...整个故事重复.
对我来说,这似乎是现在最好的解决方案,但有几个缺点.如果我在BPL中修复错误,每个程序员都必须更新他们计算机上的BPL.如果他们忘了怎么办?但是,我认为这是一个小问题.如果我们负责通知对方有关变化,一切都应该没问题.
请帮我选择一个好的解决方案.我只是因为一种愚蠢的软件开发方法,我不希望公司因错误修正而损失更多的时间和金钱.
非常感谢你.
这是奇怪行为的一天.
我们有一个用Delphi 2007创建的Win32项目,它承载.NET运行时并调用.NET来显示新表单,作为过渡期的一部分.
最近我们开始在看似随机的位置和代码点处遇到异常:算术溢出或下溢.
其中一个的堆栈跟踪如下所示:
at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
at System.Windows.Forms.Application.RunDialog(Form form)
at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)
at System.Windows.Forms.Form.ShowDialog()
at Gatsoft.Gat.UI.Windows.Forms.Remanaging.RemanageForm.DelphiOpenInNewMode(String employeeCode, String departmentCode, DateTime date) in C:\Dev\VS.NET\Gatsoft\Gatsoft.Gat.UI.Windows\Forms\Remanaging\RemanageForm.Delphi.cs:line 67
Run Code Online (Sandbox Code Playgroud)
在Visual Studio解决方案中,最外面的类库之一(即拉入它可以引用的所有引用)已经设置了一个特定的调试程序,目标是Delphi项目输出.这允许我们从Visual Studio调试.NET代码,即使程序的主要部分是用Delphi编写的.
问题只发生在从调试器运行时,而不是直接运行exe文件(通过浏览器,快捷方式,甚至是Visual Studio内部Ctrl+ F5).
有明显的机器上没有间谍软件(以As暗示此).
我们可以查看其他任何东西吗?
编辑:看起来.NET调试器正在启用此SNaN标志,而Delphi调试器则没有.我们将不得不进一步调查,但现在我会接受@Lorenzo Boccaccia的回答.
好吧,看起来我们终于解决了这个问题.在没有连接调试器的情况下,问题就开始发生了,对于我们的测试人员来说,所以我们不得不优先考虑问题.
最后,我们发现了有问题的机器的一个常见问题,它们是带有NVIDIA Quadro NVS 110M的Dell Lattitude D620笔记本电脑,以及用于配置笔记本电脑的系统映像的旧驱动程序,从2006年开始.
我在网上发现了一个帖子,但是当我重新启动以更新显示驱动程序时,我丢失了网址,因为.NET服务崩溃,主要是当机器忙于在屏幕上做某事时.重现他的问题的一种方法是打开命令提示符C:\并执行一个DIR /S只是强制大量的屏幕更新,这将触发崩溃.
他也有一张NVIDIA显卡.
我的机器上的问题大致发生在我们程序的每2-4个初创公司,但在更新视频驱动程序后,我有123个成功的初创公司没有任何问题.(顺便说一句,我可以为这些东西推荐AutoHotKey).
所以看起来我们已经找到了罪魁祸首,一个老/错误的NVIDIA驱动程序.
更新了这个问题,以便将来有人可以节省一些时间.
现在,如果你原谅我,我会在角落里哭泣. …
在我开始讨论真正的问题之前,我只想说我可能会在这里得到一些错误的细节.如果是这样,请逮捕我,甚至不要回答我的问题.
我的问题基本上是关于DLL和.NET的.我们有一个使用相当多内存的应用程序,我们正试图弄清楚如何正确地测量它,特别是当问题主要发生在客户端的计算机上时.
让我感到震惊的是,我们有一些相当大的.NET程序集和生成的ORM代码.
如果我使用的是具有唯一基址的非托管(Win32)DLL,则同一台计算机上的多个并发进程会将DLL加载到物理内存中,并将其映射到所有应用程序的虚拟内存中.因此,物理内存将用于此DLL一次.
问题是.NET程序集会发生什么.这个DLL包含IL,虽然它的这一部分可能在应用程序之间共享,但是这个IL产生的JITted代码呢?这是共享的吗?如果没有,我如何衡量以解决这个问题实际上是否导致问题?(是的,我知道,它会有所贡献,但我不会花太多时间在这上面,直到这是最大的问题).
另外,我知道我们没有查看解决方案中所有.NET程序集的基址,.NET程序集是否有必要这样做?如果是这样,是否有一些关于如何确定这些地址的指南?
任何对这一领域的见解都是最受欢迎的,即使事实证明这不是一个大问题,甚至根本不是问题.
编辑:刚刚发现这个问题:.NET程序集和DLL rebasing部分回答了我的问题,但我仍然想知道JITted代码如何影响所有这些.
从该问题及其接受的答案看来,JITted代码放在堆上,这意味着每个进程将加载共享二进制程序集映像,并在其自己的内存空间内生成代码的私有JITted副本.
我们有什么方法可以衡量这一点吗?如果这会产生大量代码,我们必须更多地查看生成的代码,以确定是否需要调整它.
编辑:在此处添加了一个较短的问题列表:
@Brian Rasmussen 在这里的答案表明JITting将按照我的预期生成JITted代码的每个进程副本,但是重新组装程序集实际上会减少内存使用量.我将不得不深入研究他提到的WinDbg + SoS工具,我已经在我的列表上停留了一段时间,但现在我怀疑我不能再把它关掉了:)
编辑:我在这个主题上找到的一些链接:
请注意,这可能最适合serverfault.com,但由于它是关于托管程序员源代码存储库,我不完全确定.我先在这里发帖,相信它会在必要时进行迁移.
我正在尝试在我自己的服务器上托管我的Mercurial存储库的克隆(我在其他地方有主要的repo),并且我正在尝试在IIS下设置Mercurial.
我在这里按照指南,但我收到一条错误消息.
解决:有关详细信息,请参阅此问题的底部.
错误消息是:
mercurial.error.RepoError:找不到存储库/路径/到/ repo /或/ config
这就是我做的.
hgwebdir.cgi,但是这个特定的文件不存在hgweb.cgi,但是,这可能是问题的根源?)我添加了一个hgweb.config,其中包含以下内容:
[paths]
repo1 = C:/hg/**
[web]
style = monoblue
Run Code Online (Sandbox Code Playgroud)我创建了c:\ hg,创建了一个子目录测试,并在其中创建了一个存储库
c:\python26\python.exe -u %s %s网站上的说明将*.cgi映射到.然后我通过导航到http://hg.vkarlsen.no/hgweb.cgi测试它,但是我收到一条错误消息.
为了更容易测试,我下载到命令提示符,导航到c:\ inetpub\hg,并执行以下命令(错误消息是下面文本的一部分):
C:\inetpub\hg>c:\python26\python.exe -u hgweb.cgi
Traceback (most recent call last):
File "hgweb.cgi", line 16, in <module>
application = hgweb(config)
File "mercurial\hgweb\__init__.pyc", line 12, in hgweb
File "mercurial\hgweb\hgweb_mod.pyc", line …Run Code Online (Sandbox Code Playgroud) 我很确定这是一个重复的问题,但我找不到原文.
我得到一些我需要"附加"一些信息的对象.基本上,如果该对象回到同一段代码,我需要看到我以前见过它.
即.这样的事情:
Dictionary<WeakReference<ObjectType>, string> _Cache;
Run Code Online (Sandbox Code Playgroud)
注意那里的弱引用(我知道WeakReference不是通用的btw),我需要使缓存的键成为弱引用,以处理对象被GC控制掉的事实.
现在,我可以使缓存充满弱引用,但我似乎回想起.NET中已经存在的类似类型的系统,它与对象一起自动GC.
请注意,我不记得这样的开销,所以在确定这是一个比我自己的缓存更好/更好的解决方案之前,我将确保阅读有关主题.不幸的是我无法更改有问题的对象,所以我需要在其他地方跟踪这个元信息.
我的局限:
基本上,像:
PropertyAttacher.Attach(instance, "Name", name);
Run Code Online (Sandbox Code Playgroud)
我记得没错吗?涉及的课程是什么?
我正在设置一个UIWebView通过检索MPJEG流的URL显示网络摄像头的内容.
我发现如果我想切换到不同的相机,如果我没有重置整个内容,它看起来更平滑UIWebView,而是在我加载到它的页面中设置一个javascript函数,来替换图像的内容, 像这样:
<img id='iImage' src='about:blank'>
<script type='text/javascript'>
function show(url)
{
iImage.src = url;
}
</script>
Run Code Online (Sandbox Code Playgroud)
如果我没有这样做,每次我切换到一个新的URL,UIWebView白色一两秒,直到新内容准备好显示,上面的代码它只是直接替换内容,没有白化.
但是,如果我在两个视频流之间来回切换,在某些时候我会收到错误UIWebView,并且通过反复试验我发现第4次在视图中显示相同的视频流时会发生这种情况.如果我尝试在浏览器选项卡中打开4个视频流,那么第4个就会陷入加载周期,直到我关闭前三个中的一个.
这让我相信:
src属性<img...>不会关闭上一个流这可以与keepalive联系起来吗?即使我已经停止在<img...>标记中显示它们,webkit浏览器系统是否可以使之前的流保持活动状态?
基本上,重现我可以这样做:
UIWebViewwv.EvaluateJavascript("show(url)")在第4个电话,我在中间得到一个蓝色问号.
可以保持活着是罪魁祸首吗?如果是这样,我能控制它吗?
在我的Visual Studio 2012中,等宽字体无法正确呈现,特别是它们无法正确呈现"等宽",即.字符的宽度不均匀.
这是一个例子,这个:
// 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
// -|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|
Run Code Online (Sandbox Code Playgroud)
使用Consolas 10点,100%缩放渲染:

这是101%缩放:

101%变焦时还有其他小问题,因此两者都不好.有没有办法让我配置Visual Studio以正确呈现等宽字体?
我试过以下字体:
索拉

信使

快递新

终奌站

显然,我尝试在Visual Studio中无法正确呈现等宽字体.
如果我在Notepad2中使用完全相同的字体和字体大小,如Consolas:

将notepad2和Visual Studio与Consolas进行比较


有什么我能做的吗?
细节:
Visual Studio 2012字体对话框:

.net ×4
base-address ×1
bpl ×1
c# ×1
components ×1
debugging ×1
delphi ×1
dll ×1
dockpanel ×1
exception ×1
executable ×1
fonts ×1
iis-7 ×1
ilgenerator ×1
ios ×1
keep-alive ×1
memory ×1
mercurial ×1
monospace ×1
path ×1
random ×1
tabpage ×1
tabpanel ×1
uiwebview ×1
windows ×1