以编程方式为WPF元素设置名称属性

3

我正在使用WiPFlash为我们办公室开发的WPF应用编写测试。为此,我不得不向多个WPF组件添加名称属性,这些组件以前并不需要这些属性。

但是,当我尝试为在运行时创建的一组对象设置唯一名称时,我遇到了问题。XAML看起来像:

<UserControl x:Class="Atlas.Activities.RibbonActivity.RibbonActivityView" 
                     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
                     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
                     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
                     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
                     xmlns:ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary" 
                     xmlns:RoutedMessaging="clr-namespace:Caliburn.PresentationFramework.RoutedMessaging;assembly=Caliburn.PresentationFramework" mc:Ignorable="d" d:DesignHeight="300" d:DesignWidth="300">

<ribbon:RibbonButton Style="{StaticResource RibbonButtonView}" Name="RibbonActivity">
    <ribbon:RibbonButton.ContextMenu>
        <ribbon:RibbonContextMenu>
            <ribbon:RibbonMenuItem x:Name="Modify" Header="Modify..." RoutedMessaging:Message.Attach="[Event Click] = [Action Modify]" />
            <ribbon:RibbonMenuItem x:Name="Hide" Header="Hide" RoutedMessaging:Message.Attach="[Event Click] = [Action Hide]" />
            <ribbon:RibbonMenuItem x:Name="Delete" Header="Delete" RoutedMessaging:Message.Attach="[Event Click] = [Action Delete]" />
        </ribbon:RibbonContextMenu>
    </ribbon:RibbonButton.ContextMenu>
</ribbon:RibbonButton>

构造函数使用以下方式设置主题:
WithSubject(activity);

这个类继承自Caliburn.PresentationFramework.Screens。

所以我想要做的是将每个控件的名称设置为主题(活动)中的名称字段。

有人能帮我吗,或者至少让我知道这是否可行,

提前感谢,

Klee。


我不明白问题出在哪里?任何 Windows.Controls.Control 项都有 .Name 属性。只需将 .Name 设置为您想要的内容,对吧?请澄清你的问题? - abelenky
我想要的是在对象创建时设置名称属性,而不是像这样: <ribbon:RibbonButton Style="{StaticResource RibbonButtonView}" Name="RibbonActivity"> 我希望能够使用类似于绑定的方式来设置它: <ribbon:RibbonButton Style="{StaticResource RibbonButtonView}" Name="{Binding Subject.name}"> 或者在C#代码中创建时设置。 - Klee
当你尝试将名称设置为{Binding}时,会遇到什么问题?我认为将数据绑定应用于名称属性会起作用。 - abelenky
@abelenky 上述方式的绑定会导致编译错误:Uid 或 Name 属性值不允许使用 _MarkupExtensions,因此 '{Binding Subject.name}' 是无效的。 - Klee
你肯定可以在你的原始问题中展示给我们,你在哪里声明了编译错误并引用了错误文本,对吧? - abelenky
1个回答

7

根据您所提供的例子

Style="{StaticResource RibbonButtonView}" Name="{Binding Subject.name}">

在XAML中无法实现这一点。 XAML是编译的,名称元素在编译过程中使用,以便您可以在代码后台中访问XAML元素。当XAML编译器将XML元素转换为C#代码时,它使用名称属性作为部分类中变量的名称。它不是可以由WPF绑定系统在运行时设置的属性。如果要动态地给控件命名,则需要在代码后台中创建它们,但我不知道这是否能实现您想要做的事情,因为我不知道您正在使用名称属性用于什么。

查看这个SO问题了解更多关于这种行为的详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接