2017-09-14 50 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')

我也不確定觸發器是否會在正確的FocusManager上設置屬性,因爲我認爲我需要將它設置在Window的FocusManager上。

所以我想我需要的東西相當於:

(僞代碼) FindAncestor(窗口).FocusManager.FocusedElement = ControlTemplate.Controls( '文字編輯')

如果讓任何意義。

歡迎任何建議,因爲我想要做的就是讓我的TextBox在窗口加載時獲得焦點。一些在WinForms中非常容易,但在WPF中似乎是火箭科學。

更新:我想我已經證明了我的理論如下面的代碼隱藏的工作原理:

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

     control.Focus(); 
    } 

回答

0

的解決方案是將觸發更改爲:

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

有趣的是,這也將導致即使我沒有在XAML或代碼隱藏中引入任何內容,TextEdit也會被聚焦。看起來WPF一直在努力做到這一點,但受到我的模板的阻撓。