【问题标题】:Can you style the first and last elements in a panel via pure XAML and without explicitly applying a style?您可以通过纯 XAML 为面板中的第一个和最后一个元素设置样式,而无需显式应用样式吗?
【发布时间】:2011-06-30 00:43:13
【问题描述】:

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

例如,我有这个...

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

...我想在第一个项目上定位一个样式,在最后一个项目上定位第二个样式。

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

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

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

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

那么,可以吗?


更新

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

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

不过,如果有人知道如何在不借助附加属性的情况下做到这一点,请随时在下面回答。

【问题讨论】:

    标签: wpf xaml position panel


    【解决方案1】:

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

    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(我认为)。

    【讨论】:

    • 是的,想过,但不想求助于多个模板。实际上,如果不手动重新创建模板本身,我们无论如何都不能使用它们,因为模板使用像 CornerRadius 这样的属性,这些属性在我们应用它的控件上不存在(例如,我们不能使用 TemplateBinding 或任何绑定那件事。)我最终只是创建了一个通用的附加属性来处理它。我会在上面的问题中添加它。
    猜你喜欢
    • 2015-08-31
    • 2021-04-25
    • 1970-01-01
    • 2014-07-15
    • 2010-09-17
    • 1970-01-01
    • 2015-01-09
    • 2020-12-06
    • 2015-06-25
    相关资源
    最近更新 更多