대부분의 경우 완벽하게 잘 수행되는 System.Windows.Controls.Control에서 파생 된 사용자 정의 wpf 컨트롤이 있습니다.UIElement.IsVisible == false 사용자 정의 컨트롤에 대해 포커스를 맞출 수 없습니다.
그러나 때때로 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
, 난 totaly UI에서 볼 수 있음을 발견 하였다. Focus() 호출을 Dispatcher에 넣으려고했는데, 컨트롤에서 UpdateLayout()을 호출 해 보았습니다.
재미있는 부분은 내가 Snnop가에서 IsVisible 속성을 확인하기 위해 사용하는 경우, 스눕 그것이
내가 다른 곳에서 내 컨트롤 구현에 분명 뭔가를 놓치거나나요 :) 사실로보고 있다는입니까? 컨트롤을 제안 사람들을 위해 지금까지 의견
편집 2012년 11월 22일이
덕분에, 완벽하게 하나
var x = control as FrameworkElement;
x.Dispatcher.Invoke(new Action(() =>
{
var isVisible = fe.IsVisible; // -> False
var focused = fe.Focus(); // -> False
}), DispatcherPriority.ApplicationIdle);
이 않았나 도움
렌더링되지 않았을 수 있습니다.
해당 코드를 언제 실행하려고합니까? Snoop을 사용하면 IsVisible은 사실이지만 앱이 유휴 상태 일 때 (즉, measure/arrange/render가 완료된 경우) 표시됩니다. UpdateLayout을 호출하면 해당 호출이 무시되는 시간이 있기 때문에 반드시 도움이되지는 않습니다 (예 : 측정/정렬 패스에있을 때). 어쩌면 당신은 그 전화를 걸고 어디서나 BeginInvoke를해야한다. 아니면 IsVisibleChanged를 훅 (hook)하고 그것을 보이기를 기다려야한다. – AndrewS
@AndrewS, 편집 참조 – Dominik
컨트롤은 어디에서 오는가? 스누프에서 체크인하는 것과 동일한 요소 인스턴스가 확실합니까? 예를 들어이 요소가 템플리트의 요소 일 경우 어쩌면 새 템플리트가 적용되었을 수 있습니다. visualtreehelper 또는 wpf 트리 비주얼 라이저를 사용하여 시각적 트리를 따라 가보고 실제로 시각적 트리에 있는지 확인하고이 요소와 모든 시각적 인 조상의 가시성이 붕괴되지 않았는지 확인하십시오. – AndrewS