2017-09-14 83 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一直在努力做到这一点,但受到我的模板的阻挠。