问题描述
问题很笼统:我如何在通过绑定和模板定义的运行时识别模板中的控件?
我需要在加载时将焦点设置为它。
这里是包含控件的 XAML:
<UserControl
x:Class="Titodoc2020.Views.NewEditPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
d:DesignHeight="300"
d:DesignWidth="300"
mc:Ignorable="d" Loaded="UserControl_Loaded">
<UserControl.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="TreeViewContentDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</UserControl.Resources>
<Grid FocusManager.FocusedElement="{Binding ElementName=Ok}" Grid.IsSharedSizeScope="True">
<Grid.RowDeFinitions>
<RowDeFinition Height="*" />
<RowDeFinition Height="Auto" />
</Grid.RowDeFinitions>
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" />
<ColumnDeFinition Width="Auto" />
<ColumnDeFinition Width="Auto" />
</Grid.ColumnDeFinitions>
<ContentControl
x:Name="UserC"
Grid.Row="0"
Grid.ColumnSpan="3"
Margin="{StaticResource XSmallLeftTopRightBottomMargin}"
Content="{Binding Selected}"
ContentTemplateSelector="{StaticResource ContentTemplateSelector}" />
<Button
x:Name="Cancel"
Grid.Row="1"
Grid.Column="1"
MinWidth="80"
Margin="8,8,8"
HorizontalAlignment="Right"
Command="{Binding CancelCommand}"
Content="Cancel"
Style="{DynamicResource MahApps.Styles.Button.Dialogs}" />
<Button
Name="Ok"
Grid.Row="1"
Grid.Column="2"
MinWidth="80"
Margin="8,8"
HorizontalAlignment="Right"
Command="{Binding CloseCommand}"
Content="OK"
Style="{DynamicResource MahApps.Styles.Button.Dialogs}" />
</Grid>
这是模板选择器:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:Titodoc2020.Views"
xmlns:model="clr-namespace:Titodoc2020.Models"
xmlns:templateSelectors="clr-namespace:Titodoc2020.TemplateSelectors">
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Titodoc\TPazDictionary.xaml" />
<ResourceDictionary Source="Titodoc\TAppDictionary.xaml" />
</ResourceDictionary.MergedDictionaries>
<templateSelectors:TreeViewDataContentTemplateSelector
x:Key="ContentTemplateSelector"
APPTemplate="{StaticResource APPContentTemplate}"
PAZTemplate="{StaticResource PAZContentTemplate}" />
这里是其中一个模板的(部分)示例:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:h="clr-namespace:Titodoc2020.Helpers">
<DataTemplate x:Key="IconFilterButton">
<StackPanel Orientation="Horizontal">
<TextBlock
VerticalAlignment="Center"
Style="{StaticResource SmallIconStyle}"
Text="{Binding}" />
</StackPanel>
</DataTemplate>
<DataTemplate x:Key="PAZContentTemplate" x:Name="PAZContentTemplate">
<ScrollViewer HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Auto">
<StackPanel>
<Grid Margin="0,6,0">
<Grid.ColumnDeFinitions>
<ColumnDeFinition Width="*" MinWidth="40" />
<ColumnDeFinition Width="*" MinWidth="40" />
</Grid.ColumnDeFinitions>
<Grid.RowDeFinitions>
<RowDeFinition Height="Auto" MinHeight="12" />
<RowDeFinition Height="Auto" MinHeight="12" />
</Grid.RowDeFinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Padding="2"
Style="{DynamicResource ContentLabel}"
Text="Cognome" />
<TextBox x:Name="FirstTextBox"
Grid.Row="1"
Grid.Column="0"
BorderBrush="Transparent"
IsReadOnly="{Binding IsReadOnly}"
Text="{Binding Paz.Cognome}" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
Style="{DynamicResource ContentLabel}"
Text="Nome" />
<TextBox
Grid.Row="1"
Grid.Column="1"
BorderBrush="Transparent"
IsReadOnly="{Binding IsReadOnly}"
Text="{Binding Paz.Nome}" />
</Grid>
</StackPanel>
</ScrollViewer>
</DataTemplate>
private void UserControl_Loaded(object sender,RoutedEventArgs e)
{
object wantednode = UserC.FindName("FirstTextBox");
((TextBox)wantednode).Focus();
}
但是 WantNode 总是 null
显然,我会确保所有模板都有一个名为“FirstTextBox”的字段:)
如您所见:
<Grid FocusManager.FocusedElement="{Binding ElementName=Ok}" Grid.IsSharedSizeScope="True">
我也尝试使用 FocusedElement 但如果我把 FirstTextBox 而不是 Ok 则它不起作用
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)