如何专注于对话框中的字段或按钮?如何在模板中找到控件?

问题描述

问题很笼统:我如何在通过绑定和模板定义的运行时识别模板中的控件?

我需要在加载时将焦点设置为它。

这里是包含控件的 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>

假设我想专注于:Name="FirstTextBox"

在我尝试过的用户控制代码后面:

        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 (将#修改为@)