您是否可以通过纯XAML设置面板中的第一个和最后一个元素并且不显式应用样式?

时间:2011-06-30 00:43:14

标签: wpf xaml position panel

好的,我知道在DataBinding中你可以很容易地定位第一个或最后一个绑定项,但我想知道是否有任何方法可以隐式地为Panel的子类中的第一个和最后一个项设置样式(例如,不添加任何标识这是第一个或最后一个。我只想使用序数位置。)

例如,我有这个......

<UniformGrid Rows="1">
    <RadioButton Content="First" />
    <RadioButton Content="Middle" />
    <RadioButton Content="Another Middle" />
    <RadioButton Content="Last" />
</UniformGrid>

...我希望在第一个项目中定位样式,在最后一个项目中定位第二个样式。

那就是说,我知道我可以......

  1. 为第一个和最后一个项目添加显式样式,或

  2. 向第一个和最后一个项添加显式附加属性,并在样式触发器中使用它。 (这是我倾向的方式。)

  3. ...但是,我希望避免这两种情况,并使用隐式样式进行纯XAML。

    那么,可以吗?


    更新

    目前,我最终只是采用了通用附加属性方法。我创建了一个名为UIHelper.Position的AP,其值为First,Last和Default。然后我们在模板中的触发器中引用它并相应地设置样式。

    它仍然要求我们使用附加属性“标记”控件,但它会让我们超越驼峰,并避免必须使用多个模板创建多个样式。 (我们的模板内部使用了CornerRadius,它不是模板化控件的属性,所以我们不能简单地将它设置为样式。它必须在触发器中完成。)

    但是,如果有人知道如何在不诉诸附属财产的情况下这样做,请随时回答以下问题。

1 个答案:

答案 0 :(得分:0)

立即想到的是使用模板选择器。您可能会尝试找到它来评估它所在的集合中的对象位置,并以此为基础选择模板。

If myCollection.IndexOf(myObj) = 0 Or myCollection.IndexOf(myObj) = myCollection.Count Then
    Return TryCast(container.FindResource("FirstLastTemplate"), DataTemplate)
Else
    Return TryCast(container.FindResource("MiddleTemplate"), DataTemplate)
End If

没有对它进行测试,但似乎它会起作用。如果您正在使用MVVM,则可以通过容器访问ViewModel(我认为)。