2016-10-24 2 views
0

두 개의 다른 명령이 있습니다. 각각은 몇 가지 행동을 수행하고 형태를 드러냅니다. Visible 속성을 true으로 설정할 때 해당 형식의 첫 번째 텍스트 상자에 포커스를 설정하기를 원합니다.메서드 실행시 텍스트 상자에 포커스 설정

나는이 주제에 대해 모든 종류의 SO 관련 기사를 보았지만 그 조각들을 함께 맞추는 것처럼 보이지 않습니다. 저는 MVVM으로 작업하고 있습니다 만, 모든 MVVM 솔루션은 QoL을 향상시키는 것만 큼 넓게 보입니다. 나는 코드 번호 코드를 내 codebehind 파일에 가지고 있으므로, 그냥 거기에 넣고 더 빨리/더 깨끗한 솔루션을 가질 수 있다고 가정 했었지만 초기에 주로 집중할 수있었습니다.

나는 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는 표시되는 창이 아니기 때문에 그룹 상자에 'Visible'-property가 false로 설정되어 있습니다. true로 설정된 경우에만 (다른 UI 요소를 두 번 클릭하여) 포커스를 표시하고 받아야합니다. – Ciphra

+0

View (* dirty * MVVM)에 포커스 제어 로직을 입력하십시오. ViewModel은 필요한 모든 것을 제공 할 수 있습니다 : 이벤트, 포커스는 명령, 속성, 어떤 컨트롤에서 포커스를 얻어야하는지 등을 추상화해야하는 경우 변경할 수 있습니다. – Sinatr

답변

1

거대한 shoutout 그래서 나는 마침내 나에게 매우 이상한 보이는 솔루션을 가지고 여기

을 저를 도와 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()에 지연된 작업이 합쳐져서 작동했다. 그들 중 어느 쪽에도 (나는 (단지 중의 1 개 또는 그 밖의 둘 모두 나를 비 초점에 다시 둔다.) 노력했다. 그러나 양쪽이 아니라 모두.

또 다른 이상한 점은 IsVisibleChanged 이벤트가 실제로 전에 속성을 변경하기 전에 을 트리거한다는 것입니다. 디버거를 통해 무엇인가 만났습니다.

관련 문제