新しいビューが読み込まれるときに、特定のテキストボックスに焦点を合わせる必要があります。
解決策は、このコード行をビューのOnLoadedイベントに追加することでした。
Dispatcher.BeginInvoke(() => { NameTextBox.Focus(); });
したがって、これは1つのビューでは機能しましたが、別のビューでは機能しませんでした。問題のデバッグに時間を費やし、OnLoadedイベントの後にBusyIndicatorがtrueおよびfalseに設定されていたため、作業中の新しいビューにすべてのコントロールからフォーカスを奪うBusyIndicatorがあることに気付きました。
したがって、解決策は、BusyIndicatorがfalseに設定されたNameTextBox
後にフォーカスを呼び出すことです。私のアイデアは、この余分な作業を処理する再利用可能なBusyIndicatorコントロールを作成することでした。ただし、MVVMでこれを行うのに問題があります。
私はツールキットの単純な拡張を作成することから始めました:BusyIndicator:
public class EnhancedBusyIndicator : BusyIndicator
{
public UserControl ControlToFocusOn { get; set; }
private bool _remoteFocusIsEnabled = false;
public bool RemoteFocusIsEnabled
{
get
{
return _remoteFocusIsEnabled;
}
set
{
if (value == true)
EnableRemoteFocus();
}
}
private void EnableRemoteFocus()
{
if (ControlToFocusOn.IsNotNull())
Dispatcher.BeginInvoke(() => { ControlToFocusOn.Focus(); });
else
throw new InvalidOperationException("ControlToFocusOn has not been set.");
}
XAMLファイルにコントロールを問題なく追加しました。
<my:EnhancedBusyIndicator
ControlToFocusOn="{Binding ElementName=NameTextBox}"
RemoteFocusIsEnabled="{Binding IsRemoteFocusEnabled}"
IsBusy="{Binding IsDetailsBusyIndicatorActive}"
...
>
...
<my:myTextBox (this extends TextBox)
x:Name="NameTextBox"
...
/>
...
</my:EnhancedBusyIndicator>
つまり、IsRemoteFocusEnabled
ViewModelでがtrueに設定されている場合(ViewModelでIsBusy
falseに設定した後に実行します)、フォーカスはに設定されNameTextBox
ます。そして、それが機能する場合、他の人はを使用EnhancedBusyIndicator
して別のコントロールにバインドし、自分のビューに最初のアクティブがあると仮定して、自分のViewModelでフォーカスを適切に有効にすることができますBusyIndicator
。
ただし、ビューがロードされると、次の例外が発生します。
プロパティ'foo.Controls.EnhancedBusyIndicator.ControlToFocusOn'を設定すると例外がスローされました。[行:45位置:26]
私が試みているこの解決策は機能しますか?もしそうなら、私がこれまでに持っているものの何が問題になっていますか(ControlToFocusOn
プロパティを設定できません)?
アップデート1
Visual Studio 10 Tools for Silverlight 5をインストールしましたが、新しいビューに移動すると、より適切なエラーメッセージが表示されます。今、私はこのエラーメッセージを受け取ります:
「System.ArgumentException:タイプSystem.Windows.Data.BindingのオブジェクトをタイプSystem.Windows.Controls.UserControlに変換できません」
また、このコントロールのDataContextを変更する必要があると思います。コードビハインドコンストラクターでは、DataContextがViewModelに設定されています。DataContextプロパティをに追加しようとしましたEnhancedBusyIndicator
が、機能しませんでした。
<my:EnhancedBusyIndicator
DataContext="{Binding RelativeSource={RelativeSource Self}}"
ControlToFocusOn="{Binding ElementName=NameTextBox}"
RemoteFocusIsEnabled="{Binding IsRemoteFocusEnabled}"
IsBusy="{Binding IsDetailsBusyIndicatorActive}"
...
>
アップデート2
オブジェクト(を実装する)にフォーカスを設定したいので、に変更UserControl
する必要があります。ただし、これで問題が解決するわけではありません。Control
TextBox
Control