我有几个图像配置为应用程序资源.
当我的应用程序启动时,主窗口的背景是通过XAML设置的:
<Window.Background>
<ImageBrush ImageSource="/myapp;component/Images/icon.png" />
</Window.Background>
Run Code Online (Sandbox Code Playgroud)
如果发生给定事件,我想将此背景更改为另一个资源("/myapp;component/Images/icon_gray.png"
).
我尝试过使用两个常量:
private static readonly ImageBrush ENABLED_BACKGROUND =
new ImageBrush(new BitmapImage(new Uri("/myapp;component/Images/icon.png")));
private static readonly ImageBrush DISABLED_BACKGROUND =
new ImageBrush(new BitmapImage(new Uri("/myapp;component/Images/icon_gray.png")));
Run Code Online (Sandbox Code Playgroud)
...但很自然地,我得到一个带有无效URI的例外.
有没有一种简单的方法来this.Background = ...
使用包Uri或资源(即:) 更改WPF窗口的背景图像(via Myapp.Properties.Resources.icon
)?
我想知道在WPF中为每个应用程序提供给定Window的单个实例的最佳方法(阅读最优雅)是什么.
我是.NET和WPF的新手,我想出的东西看起来很蹩脚.
private static readonly Object MUTEX = new Object();
private static AboutWindow INSTANCE;
public static AboutWindow GetOrCreate() {
lock (MUTEX) {
if (INSTANCE == null) {
INSTANCE = new AboutWindow();
}
INSTANCE.Show();
return INSTANCE;
}
}
private AboutWindow() {
InitializeComponent();
}
private void AboutWindow_Closed(object sender, EventArgs e) {
// the Closed events are handy for me to update values across
// different windows.
lock (MUTEX) {
INSTANCE = null;
}
}
Run Code Online (Sandbox Code Playgroud)
事情是......这看起来像完全废话.必须有一些方法以更优雅的方式实现同一目标,对吗?
PS:我经常使用该Closed
事件来更改其他打开窗口中的值.例如,我有SettingsWindow和"帐户"按钮.当我按下该按钮时,会弹出 …
更新:NSURLConnection现在似乎正确支持100-Continue.在任何情况下,此答案都包含指向用于为iOS/OSX构建libcurl的脚本的链接.
NSURLConnection
考虑到它不支持RFC 2616(HTTP/1.1)的8.2.3节,我有点困难.
基本上客户端需要能够支持发送标头Expect: 100-Continue
; 在发送请求标头之后,它必须100
在发送POST
/ PUT
body 之前等待来自具有状态代码的服务器的响应.
此外,NSURLConnection
(并且因此构建在其上的所有库)在上传所有数据之前不会从服务器返回任何响应 - 这是一个痛苦,因为服务器可能立即拒绝上载(无效凭证,没有空格,文件太大了等).虽然它对小文件"工作"(内容完全上传,并且调用了响应的委托方法),但在大文件上而不是从服务器获取错误响应(我肯定会发送它),我只是得到一个"连接失败"错误.
我知道libcurl
正确支持100-Continue
规范所以我需要一些帮助来编译它并在iOS 5项目上运行它.
我从这篇文章开始(滚动到底部)但我无法走远...
做出这些改变......
export CC=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2
export CFLAGS="-arch armv7 --sysroot=/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk"
export CPP=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-cpp-4.2
export AR=/Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/ar
./configure --disable-shared --without-ssl --without-libssh2 --without-ca-bundle --without-ldap --disable-ldap --host=arm-apple-darwin10 --build=arm-apple-darwin10
make clean
make
ar rv libcurl.armv7.a lib/*.o
Run Code Online (Sandbox Code Playgroud)
...但编译因消息而失败
(...)
checking for arm-apple-darwin10-gcc... /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/llvm-gcc-4.2
checking whether the C compiler works... no
configure: error: in …
Run Code Online (Sandbox Code Playgroud) 我newInstance()
在代码的一个性能关键区域中使用.方法签名是:
<T extends SomethingElse> T create(Class<T> clasz)
我Something.class
作为参数传递,我得到了一个SomethingElse
创建的实例newInstance()
.
今天我从列表中回过头来清除这个性能TODO,所以我运行了几个new
运算符对的测试newInstance()
.我对性能损失感到非常惊讶newInstance()
.
我在这里写了一些关于它的内容:http://biasedbit.com/new-vs-newinstance/
(抱歉自我推销......我会在这里放置文字,但这个问题会不成比例.)
我想知道的是,-server
当创建的对象数量大幅增加而不是"低"值(例如100或1000)时,为什么标志会提供这样的性能提升.
我确实从整个思考过程中吸取了教训,这只是对JVM在运行时执行的优化的好奇心,特别是对于-server
标志.另外,如果我在测试中做错了什么,我会很感激您的反馈!
编辑:我添加了一个预热阶段,结果现在更加稳定.感谢您的投入!
我想让SBT创建一个文件并为特定阶段编写项目的运行时完整类路径(scala,托管和非托管库,项目类)(在本例中,仅用于compile
).
我试图复制我用Maven做的事情,使用maven-antrun-plugin
:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>generate-runner</id>
<phase>package</phase>
<configuration>
<target>
<property name="runtime_classpath" refid="maven.runtime.classpath" />
<property name="runtime_entrypoint" value="com.biasedbit.webserver.Bootstrap" />
<echo file="../../bin/run-server.sh" append="false">#!/bin/sh
java -classpath ${runtime_classpath} ${runtime_entrypoint} $$*
</echo>
</target>
</configuration>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
Run Code Online (Sandbox Code Playgroud)
我怎么能用SBT做到这一点?
我正在尝试在我的WPF应用程序中集成屏幕截图抓取功能,我希望它看起来像剪切工具.
到目前为止,我通过创建一个不透明度设置为0.5和深色背景的全屏窗口(带有画布)来实现类似的功能.当我单击某处并开始拖动时,会绘制一个白色矩形,生成类似于此的效果.
我想要的是该矩形的内部部分在背景画布中打开一个不透明孔,这样我就可以看到所选区域 - 就像剪切工具一样.
问题是,作为.NET的新手,我不知道如何或从哪里开始.对屏幕截图窗口的OpacityMask字段进行了一些研究和测试,但无处可去.
这是一个显示当前效果的小视频.
编辑:此外,作为奖金问题,是否有一种简单的方法来获取跨越多个监视器(虚拟屏幕)的屏幕截图?Graphics.CopyFromScreen()
似乎只适用于1个屏幕.
已经修复了这个并且似乎适用于所有可能的奇怪的虚拟桌面布局:
// Capture screenie (rectangle is the area previously selected
double left = Canvas.GetLeft(this.rectangle);
double top = Canvas.GetTop(this.rectangle);
// Calculate left/top offset regarding to primary screen (where the app runs)
var virtualDisplay = System.Windows.Forms.SystemInformation.VirtualScreen;
var primaryScreen = System.Windows.Forms.Screen.PrimaryScreen.Bounds;
if (virtualDisplay.Left < primaryScreen.Left)
{
left -= Math.Abs(virtualDisplay.Left - primaryScreen.Left);
}
if (virtualDisplay.Top < primaryScreen.Top)
{
top -= Math.Abs(virtualDisplay.Top - primaryScreen.Top);
}
Run Code Online (Sandbox Code Playgroud) 我在JS(AJAX POST)中设置了一个拖放文件上传脚本,我在Safari中过滤文件夹时遇到了困难 - 版本5.0.3(6533.19.4).
每当我将多个文件/文件夹放入浏览器时,Chrome都会过滤掉这些文件夹,而Firefox会返回0,.size
因此保护这些文件无关紧要.但是,Safari将返回一个68字节的文件(文件夹的大小).
有没有办法测试这个File
(项目FileList
)是否是一个文件夹?似乎无法在File/Blob API中找到测试此条件的任何内容(尝试没有意义.type
,因为它不会为未知文件和文件夹返回任何内容......)
更多信息:
基本上发生的是AJAX请求有一个空体.我正在上传FormData
:
var file = ...; // the dropped file
var formData = new FormData();
formData.append("file", file);
var xhr = new XMLHttpRequest();
...
xhr.send(formData);
Run Code Online (Sandbox Code Playgroud) 我试图通过替换一些synchronized
块来减少代码中的线程争用AtomicBoolean
.
这是一个例子synchronized
:
public void toggleCondition() {
synchronized (this.mutex) {
if (this.toggled) {
return;
}
this.toggled = true;
// do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
替代方案AtomicBoolean
:
public void toggleCondition() {
if (!this.condition.getAndSet(true)) {
// do other stuff
}
}
Run Code Online (Sandbox Code Playgroud)
利用AtomicBoolean
CAS的属性应该比依赖同步更快,所以我运行了一些微基准测试.
对于10个并发线程和1000000次迭代,AtomicBoolean
只比synchronized
块快一点.
使用AtomicBoolean:0.0338在toggleCondition()上花费的平均时间(每个线程)
使用synchronized:0.0357在toggleCondition()上花费的平均时间(每个线程)
我知道微基准值得他们值得,但差异不应该更高吗?
我正在使用System.Net.WebClient
异步模式执行一些HTTP操作.使用异步操作的原因最重要的是,我获得了进度更改指示 - 这仅适用于异步操作,如文档所述.
所以,假设我已经设置了WebClient:
this.client = new WebClient();
this.client.UploadStringCompleted +=
new UploadStringCompletedEventHandler(textUploadComplete);
Run Code Online (Sandbox Code Playgroud)
和代表:
private void textUploadComplete(Object sender, UploadStringCompletedEventArgs e)
{
if (e.Error != null)
{
// trigger UI failure notification
return;
}
// FIXME not checking for response code == 200 (OK)
// trigger UI success notification
}
Run Code Online (Sandbox Code Playgroud)
所以你看,我假设如果没有引发异常,请求总是成功的(可能不是这种情况,因为HTTP响应状态代码可以是!= 2xx).从UploadFileAsync的文档中我无法判断是否也处理了非200响应.
我是C#的新手,我似乎无法找到一种方法来访问特定异步请求响应的标头.在我看来,每个人WebClient
只能在任何给定时间持有响应(或一组标题).
虽然我不会同时执行多个并行请求,但我仍然想知道是否有更优雅的方法来检索特定请求的响应头/状态代码,而不是必须获取"最后一个- 可用的"来自的回应WebClient
.
谢谢.
使用iOS 5的新TWRequest
API,我遇到了与块使用相关的砖墙.
我需要做的是在收到第一个请求的成功响应后,立即触发另一个请求.在第二个请求的完成块上,然后我通知多步操作的成功或失败.
这大致是我正在做的事情:
- (void)doRequests
{
TWRequest* firstRequest = [self createFirstRequest];
[firstRequest performRequestWithHandler:^(NSData* responseData,
NSHTTPURLResponse* response,
NSError* error) {
// Error handling hidden for the sake of brevity...
TWRequest* secondRequest = [self createSecondRequest];
[secondRequest performRequestWithHandler:^(NSData* a,
NSHTTPURLResponse* b,
NSError* c) {
// Notify of success or failure - never reaches this far
}];
}];
}
Run Code Online (Sandbox Code Playgroud)
我没有保留任何一个请求或在任何地方保留对它们的引用; 这只是一场千载难关.
但是,当我运行应用程序时,它会崩溃EXC_BAD_ACCESS
:
[secondRequest performRequestWithHandler:...];
Run Code Online (Sandbox Code Playgroud)
它执行第一个请求就好了,但是当我尝试使用处理程序启动第二个请求时,它会崩溃.这段代码出了什么问题?
创建请求的方法非常简单:
- (TWRequest*)createFirstRequest
{
NSString* target = @"https://api.twitter.com/1/statuses/home_timeline.json";
NSURL* url = [NSURL URLWithString:target];
TWRequest* …
Run Code Online (Sandbox Code Playgroud) 我正在尝试允许拖放到我的应用程序上的托盘图标.
我知道用更高级别的C#WindowsForms API做这件事是不可能的,因为NotifyIcon
它不支持拖动事件.
所以在一位经验丰富的Windows朋友的帮助下,我开始尝试通过Win32 API.想法是在托盘窗口处理程序中注册一个钩子(在DragAcceptFiles(hWnd,TRUE);
"SysPager"窗口处理程序上设置之后).
挂钩和下降部分正在从托盘到DLL工作.
LRESULT CALLBACK myHookProc (int code, WPARAM wParam, LPARAM lParam){
if (code == HC_ACTION)
{
PMSG msg = (PMSG) lParam;
switch(msg->message){
case WM_DROPFILES:
::MessageBox(NULL, L"Dropped files!", L"Test", MB_OK);
// call my app's registered hook
break;
}
return CallNextHookEx(oldHookProc, code, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,我弹出了消息框.
问题是我现在需要在我的C#(WindowsForms)应用程序上调用一个函数来通知这个事件.这是我遇到砖墙的地方.
当我从DLL中的应用程序注册回调时,我存储它; 但是当myHookProc
被调用时,它的值为NULL.
事实证明我误解了DLL是如何工作的; 没有我的应用程序和托盘区(他们复制或每个人都有自己的"实例",如果你可以调用它的),所以我不能使用任何静态变量或类似的东西,以保持之间的共享实例回调参考回到我的应用程序.
花了几个小时研究这一点,唯一的解决办法似乎是共享内存(试过#pragma data_seg
我跑进一些论坛,但都无济于事),但它开始觉得太矫枉过正的这种"简单"的用例.
所以百万美元的问题是:
请记住这是我第一次使用.NET,C#和Win32(不到一周); 解释原因的详细解答 - 而不仅仅是陈述 - 将不胜感激!
谢谢.
c# ×4
java ×3
wpf ×3
asynchronous ×1
classpath ×1
cocoa-touch ×1
directory ×1
dll ×1
filter ×1
hook ×1
html5 ×1
http ×1
ios5 ×1
libcurl ×1
objective-c ×1
opacitymask ×1
performance ×1
reflection ×1
rtp ×1
safari ×1
sbt ×1
scala ×1
screenshot ×1
singleton ×1
stack ×1
system-tray ×1
twrequest ×1
uikit ×1
webclient ×1
winapi ×1
window ×1