RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 768822
Accepted
Evgeniy Miroshnichenko
Evgeniy Miroshnichenko
Asked:2020-01-10 19:12:09 +0000 UTC2020-01-10 19:12:09 +0000 UTC 2020-01-10 19:12:09 +0000 UTC

如何获取从 ComboBox 继承的 CustomControl 内的 TextBox 的链接?

  • 772

描述:我需要获取对位于 ComboBox 内的 TextBox 的引用,以便控制该特定元素的 GotFocus 和 LostFocus 事件,因为我对整个 ComboBox 的焦点不感兴趣。

首先,我通过创建一个 UserControl 实现了预期的结果,在该 UserControl 中我收到了一个指向 TextBox 的链接,使用:

comboBox.Template.FindName("PART_EditableTextBox", comboBox)

在 UserControl 中一切正常。

之后我决定制作自己的 CustomControl。我想获得现有的 ComboBox 功能并添加我自己的逻辑。为此,我创建了

public abstract class MeasureComboBox<InstanceT, EnumT> : ComboBox 
{
    // ...
}

在这个抽象类的构造函数中,我想再次使用 Template.FindName() 来获取对 TextBox 的引用,但是这次这个方法返回了 null。这是我使用此方法的构造函数代码:

public MeasureComboBox()
{
   this.TextBox            = this.Template.FindName("PART_EditableTextBox", this) as TextBox;
   this.TextBox.GotFocus  += TextBox_GotFocus;
   this.TextBox.LostFocus += TextBox_LostFocus;
}

问题:您能否评论一下为什么此方法返回 null 以及是否可以获得对 this.TextBox 的引用。

注意:创建 CustomControl 时,我需要 ComboBox 的现有逻辑和设计才能工作。由于我不打算对设计进行更改,因此我从构造函数中删除了该方法:

DefaultStyleKeyProperty.OverrideMetadata(typeof(MeasureComboBox<InstanceT, EnumT>), new FrameworkPropertyMetadata(typeof(MeasureComboBox<InstanceT, EnumT>)));

这是一个与我的问题有关的 CustomControl 的损坏示例。我尽可能地简化了课程的内容,以显示特定的问题区域。执行此代码时,字段 TextBox = null:

public class MeasureComboBox : ComboBox
{
    #region FIELDS
    /// <summary>
    /// TextBox that bilongs to ComboBox control. 
    /// </summary>
    private TextBox TextBox;
    #endregion

    static MeasureComboBox()
    {
    }

    public MeasureComboBox()
    {

    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        // Почему здесь возвращается null?
        this.TextBox = this.Template.FindName("PART_EditableTextBox", this) as TextBox;
    }
}
c#
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    VladD
    2020-01-10T21:00:37Z2020-01-10T21:00:37Z

    将属性设置IsEditable为true、重载OnApplyTemplate和调用Template.FindName("PART_EditableTextBox", this)。将工作。


    这些信息是从哪里来的?MSDN没有提到类似的东西。

    让我们看看我们的组合框将具有的样式。如本答案中所述,这是最容易做到的。我们会看到类似的东西(我删除了额外的):

    <ControlTemplate TargetType="{x:Type local:MeasureComboBox}">
        <Grid x:Name="MainGrid" SnapsToDevicePixels="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="0" .../>
            </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup" AllowsTransparency="True" Grid.ColumnSpan="2" ...>
               ...
            </Popup>
            <ToggleButton ...>
                <ToggleButton.Style>
                   ...
                </ToggleButton.Style>
            </ToggleButton>
            <ContentPresenter .../>
        </Grid>
        ...
    </ControlTemplate>
    

    我们可以看到模板并没有真正的PART_EditableTextBox. 她什么时候出现?在代码中寻找一行PART_EditableTextBox,我们发现如下:

    <Style.Triggers>
        <Trigger Property="IsEditable" Value="True">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type local:MeasureComboBox}">
    

    也就是说,对于 时的情况Editable == true,选择另一个模板。我们调查一下(我再次删除了多余的部分):

    <ControlTemplate TargetType="{x:Type local:MeasureComboBox}">
        <Grid x:Name="Placement" SnapsToDevicePixels="True">
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="Auto"/>
            </Grid.ColumnDefinitions>
            <Popup x:Name="PART_Popup"...>
               ...
            </Popup>
            <Themes:ListBoxChrome .../>
            <TextBox x:Name="PART_EditableTextBox" ...>
                ...
            </TextBox>
            <ToggleButton Grid.Column="1"...>
                ...
            </ToggleButton>
        </Grid>
        ...
    </ControlTemplate>
    

    因此,在这种情况下PART_EditableTextBox出现。因此,为了让您拥有正确的子控件,您必须处于编辑模式。此外,它不取决于您使用的是 stockComboBox还是 custom,因为我们正在查看的样式是由您的控件从标准样式继承的ComboBox。

    现在我们可以删除所有生成的样式(我们不再需要它)并将其设置IsEditable="True"为 XAML 或代码隐藏。

    • 2

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5