【问题标题】:How to access x:Name-property in code?如何在代码中访问 x:Name-property?
【发布时间】:2010-09-22 19:51:01
【问题描述】:

我将 XAML 文件中的 x:Name 分配给了一个可以触发 MouseDown 事件的对象。 在那种情况下,我想再次获得发件人的 x:name-attribute。 我该怎么做?

对象看起来像这样:

<ModelUIElement3D MouseDown="ModelUIElement3D_MouseDown" x:Name="trololo">

【问题讨论】:

    标签: c# .net wpf xaml


    【解决方案1】:

    如果我正确理解了您的问题,您可以通过将发件人转换为FrameworkElement 来访问Name 属性。

    您也可以只使用设计器创建的引用对象,实例名称与您在x:Name 属性中指定的名称相同。

    以下演示了这两个选项。

      private void ModelUIElement3D_MouseDown(object sender, MouseButtonEventArgs e)
      {
        var element = sender as FrameworkElement;
    
        if (element != null)
        {
          if (element.Name == "trololo")
          {
          }
        }
    
        // Or
    
        if (sender == trololo)
        {
        }
    
      }
    

    【讨论】:

    • 将其转换为 FrameworkElement 然后访问似乎不起作用,但 sender == trololo 可以。谢谢!
    • @Hedge,强制转换为 FrameWorkElement 不起作用的原因是 ModelUIElement3D 继承链不是从 FrameworkElement 派生的。我不得不去检查一下,但我很高兴你有解决方案。
    【解决方案2】:

    基于 FrameworkElement 的 Name 属性是标准依赖属性,旨在用作 x:Name 的快捷方式(请参阅FrameworkElement.Name Property)。但是,许多依赖对象不是从 FrameworkElement 派生的,但它们仍然可以使用 XAML 附加的属性 x:Name。要在运行时确定在 XAML 中声明的不是从 FrameworkElement 派生的对象的 x:Name,您可以使用 GetValue 检索对象的附加属性,如下所示:

    foreach(var column in gridItem.ColumnDefinitions)
    {
        var name = column.GetValue(FrameworkElement.NameProperty) as string;
        if (name == "IsCheckedColumn")
            column.Width = show ? CheckUncheckColumn_VisibleWidth : Column_InvisibleWidth;
        else if (name == "DeleteColumn")
            column.Width = show ? DeleteColumn_VisibleWidth : Column_InvisibleWidth;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-05
      • 2019-10-03
      • 1970-01-01
      • 2021-02-16
      • 2021-10-26
      相关资源
      最近更新 更多