我有以下的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();
}