2017-09-14 16 views
0

나는 다음은 ControlTemplate 있습니다WPF 설정 초점은 컨트롤 템플릿 내에서 제어 할 수

지금 내 창에 텍스트 상자를 추가 한
<ControlTemplate TargetType="dxe:TextEdit" x:Key="TextEditMultiStyle"> 
    <Border x:Name="border" BorderBrush="#054c74" BorderThickness="1" CornerRadius="1"> 
     <Border.Effect> 
      <DropShadowEffect ShadowDepth="0" Color="#0980c2" Opacity="1" BlurRadius="5" /> 
     </Border.Effect> 
     <dxe:TextEdit x:Name="textEdit" TextWrapping="Wrap" AcceptsReturn="True" Text="{TemplateBinding Text}" BorderThickness="0" 
         EditValue="{Binding RelativeSource={RelativeSource TemplatedParent}, 
          Path=EditValue, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True}" 
         VerticalContentAlignment="Top"/> 
    </Border> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsFocused" Value="true"> 
      <Setter Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

이 때 창이로드 그것에 포커스를 설정하고자합니다. 지금까지 아무 것도 작동하지 않았고 ControlTemplate 내 TextEdit에 포커스를 맞추어야하기 때문에 그럴 것이라고 믿습니다. 이것이 트리거가 수행해야하는 작업입니다.

불행히도 트리거로 지정해야 할 사항을 해결할 수 없습니다. 위의 코드는 단지 런타임 불만을 제공합니다.

System.Windows.Data 오류 : 4 : 'ElementName = textEdit'참조로 바인딩 소스를 찾을 수 없습니다. BindingExpression : (경로 없음); DataItem = null; 대상 요소는 'TextEdit'(Name = 'MarkerTextEdit'); 'FocusedElement'(유형 'IInputElement')

나는 또한 Window의 FocusManager에 설정해야한다고 생각하기 때문에 트리거가 정확한 FocusManager의 속성을 설정한다고 확신하지 못합니다.

(의사 코드) FindAncestor (윈도우) .FocusManager.FocusedElement = ControlTemplate.Controls ('텍스트 편집기')이 어떤 의미가있는 경우

:

그래서 난에 해당 무언가를 필요가 있다고 생각합니다.

내가하고 싶은 것은 윈도우가로드 될 때 TextBox에 포커스를 가져 오기만하면 모든 제안을 환영합니다. WinForms에서는 어리 석으나 WPF에서는 로켓 과학처럼 보입니다.

업데이트 : 나는 같은 내 이론을 확인했습니다 생각하는 코드 숨김 작동 다음

<Trigger Property="IsFocused" Value="true"> 
      <Setter TargetName="textEdit" Property="FocusManager.FocusedElement" Value="{Binding ElementName=textEdit}"/> 
     </Trigger> 

흥미롭게도,이 또한 원인 :

private void MarkerEditorWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     var control = (UIElement)MarkerTextEdit.Template.FindName("textEdit", MarkerTextEdit); 

     control.Focus(); 
    } 

답변

0

솔루션가 방아쇠를 변경하는 것입니다 XAML 또는 코드 숨김에 아무것도 넣지 않아도 TextEdit이 포커스를받습니다. 마치 WPF가 그 일을 모두 시도했지만 템플릿에 방해가되었던 것처럼 보입니다.