2009-08-30 61 views
4

我有一個要求,可以從一個控件自動選擇到SL3應用程序中的「下一個控件」。例如,一個文本框限制爲3個字符 - 在輸入第三個字符時,焦點應自動移動到表單上的下一個控件(我的實際用法稍有不同,但該示例足夠)。Silverlight 3中的自動標籤頁

但是,由於SL自動確定選項卡序列,除了逆向工程/複製Silverlight的邏輯以找出視覺樹中的哪個控件應該是下一個獲得焦點的控件之外,似乎沒有辦法做到這一點。

有沒有人已經實現了這一點?

回答

2

如果您正在尋找一個通用的解決方案,並且可以基於可視化樹排序(而不是排列布局),我想它不會那麼糟糕。雖然沒有聽說過它被完成。

大部分的電話號碼或信用卡條目表單我看到這種行爲老實說,只是在正確的變更處理程序中硬編碼下一個字段,當輸入正確的字符數。

因爲聽起來像你的自動對焦解決方案(對於3個字符)已經需要某種事件連接,監視TextChanged事件,難道你不能繼續並且1)硬編碼焦點()添加到您知道的下一個表單元素中,2)使用Tag屬性來存儲您想要關注的控件的名稱,然後執行FindName + Focus,或者3)執行某種VisualTreeHelper (或通過同伴進行邏輯樹搜索)?

4

我一直在尋找一個相當普遍的解決方案 - 但我已經能夠做一些相當具體的事情 - 基本上它使用VisualTreeHelper來查找具有與我想要選項旁邊的控件相同的父項的子項,並着重於此。

這比比較容易通過我所有的控件(這是一個相當大的LOB應用程序)併爲每個控件配置「下一個」控件。

這是我的代碼,以防萬一它幫助別人。 (VisualTreeeHelperUtil是我自己的一個類,它爲VisualTreeHelper增加了一些實用功能)

public static void TabNext(DependencyObject parentElement, Control fromControl) 
{ 
    var children = VisualTreeHelperUtil.FindChildren<Control>(parentElement). 
     Where(c => c.IsEnabled && c.IsTabStop && c.Visibility == Visibility.Visible). 
     ToList(); 

    if (children.Contains(fromControl)) 
    { 
     var thisIndex = children.IndexOf(fromControl); 
     var targetIndex = thisIndex + 1; 
     if (children.Count > targetIndex) 
     { 
      var targetChild = children[targetIndex]; 
      fromControl.Dispatcher.BeginInvoke(() => 
       { 
        targetChild.Focus(); 
        var txt = targetChild as TextBox; 
        if (txt != null) 
        { 
         txt.SelectAll(); 
        } 
       }); 
     } 
    } 
} 
+0

感謝@Craig Shearer for sharing this。我已經結束了一些自定義附加的行爲和一些代碼適應。看看代碼:https://gist.github.com/4576803 – 2013-01-20 05:25:08