我有一个带有简单项目模板的ItemsControl,如下所示:
<ItemsControl x:Uid="itemsControlMarketingText" x:Name="itemsControlMarketingText">
<ItemsControl.ItemTemplate>
<DataTemplate x:Name="dataTemplateMarketingText">
<BulletDecorator x:Uid="bdMarketingTextBullet" x:Name="bdMarketingTextBullet" Width="Auto" >
<BulletDecorator.Bullet>
<Ellipse Width="5" Height="5" Fill="Black" Margin="8,0,0,0"></Ellipse>
</BulletDecorator.Bullet>
<TextBlock x:Uid="tbMarketingTextItem" x:Name="tbMarketingTextItem" Text="{Binding}" ></TextBlock>
</BulletDecorator>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
我想在后面的代码中设置tbMarketingTextItem的样式,因此它适用于填充列表时创建的所有文本块。所以基本上就像我在文本块上有一个Style属性一样,如
<Style="{DynamicResource BaseTextBlockMarketingText}"
问题在于这个特定的应用程序,它正在做一些事情来合并不同的样式表并在代码隐藏中应用样式。有没有办法从数据模板中获取控件以应用样式?我怀疑我必须以某种方式使用“FindName”方法,但我无法弄清楚如何。
答案 0 :(得分:0)
只需使用FindResource()
将Style定义为资源,然后将setter等合并到其中,无论您从何处获取它们。
如果您需要在首次使用样式后执行此操作,则无效。以下替代方法适用于该情况。
var btnStyle = FindResource("BaseTextBlockMarketingText") as Style;
// Contrived example
btnStyle.Setters.Add(new Setter(Button.BackgroundProperty, Brushes.YellowGreen));
或者替换它。即使已经使用了样式,这也会起作用,因为您没有改变使用的Style对象。
var btnStyle = new Style();
// Contrived example
btnStyle.Setters.Add(new Setter(Button.BackgroundProperty, Brushes.YellowGreen));
this.Resources["BaseTextBlockMarketingText"] = btnStyle;
XAML
<Style
x:Key="BaseTextBlockMarketingText"
TargetType="Button"
BasedOn="{StaticResource {x:Type Button}}"
/>
...
<Button
Style="{DynamicResource BaseTextBlockMarketingText}"
/>
使按钮样式成为视图的属性。 Window,UserControl,没关系。下面我的XAML将假设它是一个窗口,但它确实无关紧要。
这使我们可以替换样式而不是更改现有样式实例。
#region ButtonStyle Property
public Style ButtonStyle
{
get { return (Style)GetValue(ButtonStyleProperty); }
set { SetValue(ButtonStyleProperty, value); }
}
public static readonly DependencyProperty ButtonStyleProperty =
DependencyProperty.Register(nameof(ButtonStyle), typeof(Style), typeof(MainWindow),
new PropertyMetadata(null));
#endregion ButtonStyle Property
按照您喜欢的方式初始化它。出于测试目的,我刚刚在视图构造函数中创建了一个快速:
public MainWindow()
{
InitializeComponent();
var style = new Style(typeof(Button), FindResource(typeof(Button)) as Style);
style.Setters.Add(new Setter(Button.BackgroundProperty, Brushes.LightSkyBlue));
ButtonStyle = style;
}
并像这样使用它。这里的AncestorType
参数是唯一重要的地方ButtonStyle
特别是Window的属性:
<Button
Style="{Binding ButtonStyle, RelativeSource={RelativeSource AncestorType=Window}}"
/>
它可能是一个viewmodel属性,但Style
确实应该是视图的一部分。