0

基礎:MVVMパターンまたはそのサブセットを使用しています。

メインウィンドウには、新しいDataContextでユーザーコントロールを開くボタンがあります。関数は次のようになります。

public void SetUserControl()
{
     UCDatacontext = new UCViewModel(this);
     base.OnPropertyChanged("UCDatacontext");
     UCViewVisibilty = Visibility.Visible;
     UCDatacontext.IniFocus(); 
}

そして、完了したら、usercontrolを閉じてDataContextを破棄します。今私が抱えている問題は、フォーカス設定が正しく機能していないように見えることです。ビューが表示されたときにフォーカスを設定したいテキストボックスがユーザーコントロールにあります。ただし、初めてフォーカスを設定しようとすると、テキストボックスが点滅しないカレットで埋められるだけです。調査の結果、TBがキーボードフォーカス(論理フォーカスのみ)を取得していないためであると考えられます。キーボードのフォーカスを明示的に設定した後も、点滅しないカレットが表示されます。フォーカスが取得されるのは、TBをクリックした後です。フォーカスを設定するために使用している方法は、ここで説明する方法と似ています。
ビューで、テキストボックスのFocusSetイベントに出力して書き込み行のデバッグを行うと、設定されますが、SetUserControl()を初めて呼び出したときのみです。SetUserControl()を再度呼び出すと、ビューを表示する以外は何もしませんが、フォーカスセットイベントはトリガーされません。
以下は、メインウィンドウからのコード行です。

<Grid Grid.ColumnSpan="5" Grid.RowSpan="5" Visibility="{Binding Path=UCViewVisibilty }" x:Name="UCGrid"   >
    <Grid.Effect>
        <DropShadowEffect  />
    </Grid.Effect>
    <View:UCView DataContext="{Binding Path=UCDatacontext}"   />    
</Grid>

およびUserControlグリッド:

<Grid > 
    <TextBox Uid="UCTB" localExtensions:FocusExtension.IsFocused="{Binding Path=UCTBFocus}" Height="23" HorizontalAlignment="Left" Margin="113,56,0,0" Name="UCTB" VerticalAlignment="Top" Width="165" Text="{Binding Path=UCTBContent, UpdateSourceTrigger=PropertyChanged}" GotFocus="UCTB_GotFocus" />
</Grid >

フォーカスはUserControlViewModelで設定され、Usercontrolがレンダリングされた後に設定されます。

4

2 に答える 2

0

このようにフォーカスを上から下に1つずつ設定します。

InitializeComponent();
        FocusManager.SetFocusedElement(this, TabItem); //this is Window , TabItem is UserControl in this Window
        FocusManager.SetFocusedElement(TabItem, TextBox); // TabItem is UserControl and TextBox is Control in TabItem UC

これがお役に立てば幸いです。

于 2012-11-20T05:18:49.107 に答える
0

結局のところ、コードをいじった後、ビューでフォーカスが適切に設定されなかった理由は、ビューモデルのバインディングが次のとおりだったためです。

    bool _tBfocus;
    public bool UCTBFocus
    {
        get { return _tBfocus; }
        set
        {
            _tBfocus= value;
            base.OnPropertyChanged("UCTBFocus");

       }

それ以外の:

    bool _tBfocus;
    public bool UCTBFocus
    {
        get { return _tBfocus; }
        set
        {
            if (_tBfocus == value)
                return;
            _tBfocus= value;
            base.OnPropertyChanged("UCTBFocus");

        }
    }

それを変更した後、すべてがうまくいきました:/しかし、誰かが私が持っていたこの迷惑がなぜそれによって引き起こされたのかを私に説明できれば、私は本当に感謝します:)

于 2012-11-20T20:53:33.850 に答える