2016-10-24 142 views
0

我有2個不同的命令叫;每個人都會執行一些操作並顯示一個表單。當他們將Visible屬性設置爲true時,我希望他們將焦點設置爲該表單中的第一個文本框。方法執行時將焦點設置爲文本框

我已經看到關於這個主題的各種SO文章,但我似乎無法拼湊在一起。我正在使用MVVM,但所有MVVM解決方案看起來相當廣泛,只是一些QoL改進。我在我的代碼隱藏文件中有一些代碼,所以我認爲我可以把它放在那裏,並有一個更快/更清潔的解決方案,但我可以找到啓動焦點。

我已經搞亂了Focusmanager,但這似乎並沒有給我帶來任何地方。

整個建築的棘手部分如下;

<ListBox Grid.Column="0" Grid.Row="1" Margin="5" IsEnabled="{Binding IsEnabled}" ItemsSource="{Binding DisabledConfigs}" SelectionMode="Extended" SelectedItem="{Binding SelectedConfig}"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="SelectionChanged"> 
      <cmd:EventToCommand Command="{Binding SelectionChanged}"/> 
     </i:EventTrigger> 
     <i:EventTrigger EventName="MouseDoubleClick"> 
      <cmd:EventToCommand Command="{Binding EditConfig}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</ListBox> 

EditConfig -Command觸發檢查雙擊對象的某些特性的方法,和任一示出了形式或沒有。當它發生時,該表單中的第一個文本框應該得到焦點,否則沒有重要的事情發生。

我一直是這樣愚蠢的生活質量,問題在我的整個上午掙扎了,所以我準備我的左捐腎給誰就給誰分我,我可以清晰地採取方向..

編輯:由AdminSoftDK的建議之後,我嘗試了以下

// Auto-generated 
private void nameBoxEdit_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
{ 
    if (nameBoxEdit.IsVisible) 
    { 
     // nameBoxEdit is (quite self-explanatory) the textbox that I want to focus on 
     nameBoxEdit.Focus(); 
    } 
} 

我相信這應該是相當接近的解決方案,但它不工作不變。

+0

爲什麼解決方案「按顯示窗口的標籤順序關注第一個UI元素」滿足您的需求? – dymanoid

+0

@dymanoid,因爲它不是一個顯示的窗口,而是一個groupbox,它的'Visible'屬性設置爲false。只有當它被設置爲true(通過雙擊另一個UI元素),它纔會顯示並應該獲得焦點。 – Ciphra

+0

將焦點控制邏輯放入View(* dirty * MVVM)中。 ViewModel可以提供所有必要的事件,它可以通過命令,屬性,如果需要從哪個控件獲取焦點等進行抽象,可以改變它的焦點。 – Sinatr

回答

1

巨大的大喊答題節目環節以adminSoftDK幫助我在這裏

所以,我終於得到了解決,這看起來很奇怪我的,但它的工作,所以我不是在抱怨;

private void nameBoxAdd_IsVisibleChanged(object sender, System.Windows.DependencyPropertyChangedEventArgs e) 
    { 
     if(!nameBoxAdd.IsVisible) 
     { 
      nameBoxAdd.UpdateLayout(); 
      // Task.Delay(500); abundant 
      nameBoxAdd.Focus(); 
      // After testing some more, the Task.Delay(500) is not needed either. 
      // It's just the combination of UpdateLayout() and Focus() 
     } 
    } 

我不得不在這裏方法,調用和財產的檢查相當的exstensive列表,看看是否有什麼工作,一個低,不料重點是理所當然的。我開始過濾,出於某種原因,UpdateLatyout()Focus()上的延遲任務的聯合工作使其工作。沒有他們(我試圖讓只是其中一個或另一個都讓我在非焦點再次),但他們兩個。

另一個奇怪的事情要注意的是,IsVisibleChanged事件觸發之前實際上改變屬性。我用調試器跑過的東西..