GrapeCity.Win.Input.Interop.Date光标移动
Date控件获得焦点时,光标是在年上(CursorPosition=Era)请问当点击Spin的上下箭头时,光标移到月上,月份减少或增加,应该怎么弄。
谢谢 居然真的看到有人在用这个神器了。你们是从4.0之前版本迁移过来的项目吗?
关于你提到的问题。示例解决代码如下:
public partial class Form1 : Form
{
private Date _date1;
public Form1()
{
InitializeComponent();
//
// Normally init some Interop.Date.
//
Date date1 = new Date();
this.Controls.Add(date1);
this._date1 = date1;
_date1.Width += 17;
_date1.Spin.Visible = Visibility.ShowAlways;
_date1.Format.Pattern = "ggg ee年MM月dd日";
//
// Magic starts from here:
//
var gcDateTime = _date1.InnerEditor;
for (var i = 0; i < gcDateTime.SideButtons.Count; i++)
{
var sideButton = gcDateTime.SideButtons as GrapeCity.Win.Editors.SpinButton;
if (sideButton != null)
{
sideButton.IsDefaultBehavior = false;
sideButton.SpinDown += delegate
{
MoveCaretToDateTimeMonthField(gcDateTime);
gcDateTime.ShortcutSpinDown();
};
sideButton.SpinUp += delegate
{
MoveCaretToDateTimeMonthField(gcDateTime);
gcDateTime.ShortcutSpinUp();
};
}
}
}
private static void MoveCaretToDateTimeMonthField(GrapeCity.Win.Editors.GcDateTime gcDateTime)
{
var monthField = gcDateTime.Fields.Find<GrapeCity.Win.Editors.Fields.DateMonthField>();
if (monthField != null)
{
var selectionStart = 0;
foreach (GrapeCity.Win.Editors.Fields.DateField field in gcDateTime.Fields)
{
if (field == monthField)
{
break;
}
selectionStart += field.Text.Length;
}
gcDateTime.Select(selectionStart, 0);
}
}
}
主要思想是禁用默认的Spin行为,自己挂事件处理Spin行为。在处理函数中,随心所欲地将光标移动到合适的位置。
所使用到的主要黑技术有
1. InnerEditor对象其实封装了真正的GrapeCity.Win.Editors.GcDateTime实例
2. Spin按钮的行为其实是通过IsDefaultBehavior搞定的。
3. 怎么找计算光标的目标位置
希望你喜欢。 回复 1楼viviant的帖子
感谢@Leo版主的详细和精彩的回复。
@viviant 如果2楼的方案依然有问题,可以提出来讨论。 回复 2楼Leo的帖子
我们确实是之前版本迁移过来的项目。
问题解决了:hjyzw:
谢谢 回复 4楼viviant的帖子
好的。
谢谢反馈。
此问题关闭,如果有新问题欢迎提出来讨论。
页:
[1]