首页 > 解决方案 > c# wpf,xaml 嵌套属性/控件继承可能吗?

问题描述

    <Grid Name="mainSceneGrid"  Grid.Row="1" Background="#FF075035">
        <Grid Name="navigationGrid">
            ......
        </Grid>
    </Grid>

通常我们会直接从后面的代码中调用navigationGrid.xxx,非常简单有效。然而,当我们开始得到很多依赖和嵌套的网格时,如果能够调用这样的属性,那就太棒了:

mainSceneGrid.navigationGrid.xxx

所以我们得到了某种形式的结构化代码和更容易使用的智能感知,这可以用 xaml 实现吗?

标签: c#wpfxaml

解决方案


您误解了 UI 元素的名称。

对于 XAML,首先是使用该方法在元素的可视树中注册一个名称,FrameworkElement.RegisterName (String, Object)然后使用该方法在该树中搜索FrameworkElement.FindName (String)。这主要用于 ElementName 类型的绑定。这些名称在名称范围内必须是唯一的。

其次,x:Name 指令除了在可视树中创建名称之外,还在“* .gics”文件中创建一个字段。此文件是 Studio Designer 生成的 XAML 反射。如果将光标放在对InitializeComponent ()方法的调用上并按 F12,则可以查看它。当您更改 XAML 代码时,它会自动更改。当您在 Code Behind 中引用元素的名称时,您实际上并不是在引用 XAML 中的名称,而是在该文件中的一个字段。而且,如果您对 Sharpe 有一点了解,那么您就会明白您无法创建名称为name1.name2.

至于您的问题,其根源在于您没有以 WPF 的典型方式使用 WPF。WPF 是围绕 UI 元素通过绑定自行获取属性值的概念设计的。因此,使用 ElementName 绑定以外的 WPF 元素名称是不正确实现的标志。这种不正确的实现方法充满了特定任务的发生、代码臃肿以及错误和错误的高概率。

我建议你,尤其是在培训的初始阶段,一般来说,甚至不要打开“* .xaml.cs”文件。InitializeComponent ()除了调用方法之外,后面的代码中应该没有任何内容。当您学习 WPF 的基础知识(布局、绑定、数据上下文、样式、模板、触发器、转换器)后,您将能够有意识地决定使用 Code Behind。但在实践中,几乎没有真正需要的此类任务。


推荐阅读