2

ほとんどの場合、System.Windows.Controls.Control から派生したカスタム wpf コントロールがあります。

しかし、UIElement.Focus() を呼び出すコントロールで x.Focus() を呼び出すと、false が返され、コントロールがフォーカスされないことがあります。

掘り下げた後、私はそれを見つけました

var x = control as FrameworkElement;
var focusable = x.Focusable; // -> true
var enabled = x.IsEnabled;  // -> true
var visible = x.IsVisible; // -> FALSE <- !!! ARRGG

コントロールがレンダリングされ、UI で完全に確認できます。Focus() への呼び出しを Dispatcher に配置しようとしましたが、コントロールで UpdateLayout() を呼び出してみましたが、どちらも役に立ちませんでした。

最もおもしろいのは、Snnop を使用して IsVisible プロパティをチェックすると、Snoop が True であると報告することです :)

コントロールの実装または他の場所で、明らかな何かを見逃していませんか?

編集 22.11.2012

これまでのコメントに感謝します。コントロールが完全にレンダリングされていない可能性があることを示唆しているコメントに対して

var x = control as FrameworkElement;
x.Dispatcher.Invoke(new Action(() =>
{
var isVisible = fe.IsVisible; // -> False
var focused = fe.Focus(); // -> False
}), DispatcherPriority.ApplicationIdle);

これも役に立ちませんでした。

4

3 に答える 3

0

IsVisibleをチェックしてfalseを確認したのはいつですか。コントロールは完全に初期化され、ロードされましたか?スヌープがそれを真であると見なす場合、それはそうであるに違いありません:)そして、いつあなたはあなたのコントロールに焦点を合わせようとしますか?完全に初期化されていないときに焦点を合わせようとすると、機能しない理由がかなりある可能性があります。

とにかく、UIElement.Focusを使用する代わりに、Keyboard.Focusメソッドを使用してコントロールを選択してみてください。

Keyboard.Focus(x);
于 2012-11-21T14:22:55.403 に答える
0

私は同じ問題を抱えていましたが、何が原因なのかわかりませんでした。回避策で修正しました。

スタイルで Visibility を Collapsed に設定し、次に Loaded イベントで Visible に設定します。これはすべての用途にとって理想的ではないことは承知していますが、他の誰かがこの問題に遭遇した場合は、この回避策を試して解決できます.

 // Set to visible on load
 Loaded += delegate
 {
     Dispatcher.BeginInvoke(new Action(() => Visibility = Visibility.Visible));
 };


 <!-- By default set to Collapsed -->
 <Style TargetType="{x:Type MyCustomTypeThatIsMisbehaving}">
    <Setter Property="Visibility" Value="Collapsed"/>
 </Style>

コントロールが表示されると、 IsVisibleChanged が発生し、それ以降は問題なく動作しているように見えます

于 2013-07-12T21:05:22.887 に答える