WPF PreviewKeyDown Fired Multiple Times

I want to implement such feature: In a barcode text box, when a “=” key (or “+” key) is pressed, the “=” (or “+”) character will not append to barcode textbox, and program will use textbox text as barcode to search product item.

 

To achieve this effect, we need use handle PreviewKeyDown event. Listening for KeyDown event is not working here, because when KeyDown event is fired, the new character is already appended to the textbox. (PreviewKeyDown is a tunneling event and KeyDown is a bubbling event)

But when I pressed “=” key, the PreviewKeyDown event is triggered multiple times.

 

By debugging I found only one event’s IsDown property is true, while other triggered events’ IsDown property is false and their IsUp property is true. To fix this solution we can check whether e.IsDown is true.

C# WPF Generate and Display QR Code

Download QrCode.Net

Download and install QrCode.Net from NuGet, there are two ways to install it.

Right click your project, select Manage NuGet Packages, in newly opened NuGet Package Manager tab, choose Browse tab and type QrCode.Net in Search text box, and install the QrCode.Net package by clicking the download icon at right side.

Or

Run following command in Package Manager Console

 

Create Container Window

Create a window with name MainWindow and add an Image control named QrCodeImage into it.

MainWindow.xaml

 

Display QR Code in Window

In MainWindow.xaml.cs MainWindow constructor function, add following code (should be located after InitializeComponent() method)

 

Running the project you will see the QR Code is displayed in the MainWindow.

 

 

RavenDB NotSupportedException

When I run the code

 

I got following exception

RavenDB NotSupportedException

An exception of type ‘System.NotSupportedException’ occurred in Raven.Client.Lightweight.dll but was not handled in user code

Additional information: Could not understand expression: .Where(p => p.ProductSn.Contains(value(YSPOS.MainWindow+<>c__DisplayClass10_0).barCode))

 

It’s because there is no index for ProductSn attribute is created.

 

Solution

To fix this issue, we need create index fo ProductSn attribute.

 

Create a class extending AbstractIndexCreationTask class

 

Then execute this index creation task after DocumentStore initialization.

 

Ext JS 6 Modern Set Field Renderer in itemTpl

In Ext Js 6 Modern (or Sencha Touch), if Ext.grid.plugin.RowExpander plugin is enabled for Ext.grid.Grid, there will be a expander icon (plus icon) at left side of each row. Clicking the expander icon will expand the selected row, and more detail will be displayed. This detail page can be set by itemConfig.body.tpl option.

 

Like following code

 

And the tpl option is actually XTemplate, so the above code can be written as following form as well:

 

Note that here XTemplate cannot be replaced by Template class (using Template will display raw literal value as {…})

 

 

To use a renderer function for field in the template string, we need add a member function to the template

Then the template can be changed like this

 

 

Ext JS 6 Modern Set TabBar Scrollable

By default in Ext JS 6 Modern version (or Sencha Touch), the TabPanel’s TabBar is not scrollable. That means if opened tabs is too many that the TabBar will push the earlier tabs to left side, then they will become invisible anymore (because it’s not scrollable)

To make it scrollable, we need set tabBar.scrollable config to true when creating TabPanel

Then we can drag the TabBar to scroll it.

 

By default the scrollable is 'horizontal' , and of course you can set it to 'vertical' .

 

 

 

Ext JS 6 Duplicate Entity Name Error

When I reopened Account Profile tab after closing it, I got following error (shown in browser’s console)

Duplicate entity name “AccountProfileModelList”: AccountProfileModelList and AccountProfileModelList(…)

 

In this page, I defined a Model named AccountProfileModelList

 

When opening the Account Profile tab first time, the AccountProfileModelList will be defined. And when opening the tab second time, the AccountProfileModelList will be defined again. This is why the error appeared.

What’s interesting is that In Ext 5 above scenario won’t cause any error, but in Ext 6, a model cannot be defined twice anymore.

 

To fix this issue, we need use typeof(AccountProfileModelList) == 'undefined'  to check whether the model is already defined, if it’s defined the model creation code won’t be executed.

So the above code should be changed to

 

A more Ext way to detect whether a Ext class is already defined is using Ext.ClassManager.isCreated(className)

Above code can also be changed to

 

Ext JS 6 Invalid Component Id

In Ext 6, I got following error

ExtJs invalid component id “profile.ModifyUserBasicInfo”

 

Following is code producing the error

 

This error doesn’t appear in Ext 5, after upgrading to Ext 6, it appears now.

 

It is caused by the id property cannot contain “.” symbol, but the id property we used here is profile.ModifyUserBasicInfo

To fix this issue, we can replace all “.” to “-“.

 

Following link from describes the id property naming rule

http://docs.sencha.com/extjs/6.2.1/classic/Ext.window.Window.html#cfg-id

The original quote

Note: Valid identifiers start with a letter or underscore and are followed by (optional) additional letters, underscores, digits or hyphens.

 

 

 

MySQL find all MyISAM tables

The information_schema table saves information about databases, tables, columns, indexes and triggers, etc.

 

To list all MyISAM tables, we can use following SQL

 

And to find MyISAM tables in database wordpress

 

Next filter them with a table prefix wp_

Ext JS form load custom object

I have a custom object currentUser, it contains bank account name, mobile number,  and I want fill the form with currentUser’s properties.

 

To load a custom object,  first define a Model, then instantiate the Model with custom object, next call loadRecord with the model object. Note that I tried Ext.form.Panel loadRecord(), it’s not working for me, Ext.form.Basic should be used here. So we need call getForm() to get Ext.form.Basic

 

Another example

http://jsfiddle.net/el_chief/HBah5/4/

 

 

 

DeferredResult not working in Tomcat

The DeferredResult works on my local machine, but not work on the server machine.

On my local machine when a DeferredResult called setResult, the response will return immediately. But on remote server machine, it only return the response to client after 30s (default timeout is 30s).

According to above posts, it may be caused by earlier version tomcat 8 issue.

Then I tried jetty on remote server machine, it works. Next I checked the version by running CATALINA_BASE/bin/version.sh, it’s displaying

Server version: Apache Tomcat/8.0.14 (Debian)

And my local tomcat version is 8.0.36

 

Then I upload my local tomcat to remote server and try DeferredResult again, it works!

 

http://stackoverflow.com/questions/24619445/spring-async-deferredresult-not-working-in-tomcat-8