gpt4 book ai didi

c# - Silverlight 而非 WPF 中嵌套样式(如 CSS)的挂件

转载 作者:太空宇宙 更新时间:2023-11-03 13:29:20 25 4
gpt4 key购买 nike

我的任务是为嵌套在每个 StackPanel 中的每个 Button 设置 20px 的边距。

在 WPF 中,我在 Application.Resources 中使用了这段代码:

<Style TargetType="StackPanel">
<Style.Resources>
<Style TargetType="Button">
<Setter Property="Margin" Value="20" />
</Style>
</Style.Resources>
</Style>

在 Silverlight 中缺少“Style.Resources”标签。但我试过这段代码:

<Style TargetType="StackPanel">
<Setter Property="Resources">
<Setter.Value>
<ResourceDictionary>
<Style TargetType="Button">
<Setter Property="Margin" Value="20" />
</Style>
</ResourceDictionary>
</Setter.Value>
</Setter>
</Style>

可悲的是,Silverlight 方面没有发生任何事情(没有错误,没有结果)。

有没有人知道如果在 Silverlight 中这种行为可能无需在每个 Stackpanel 上手动设置 Style by key?

最佳答案

在 Silverlight 中不能简单完成的事情,可以使用附加的依赖属性来完成。这是这样的属性,它可以做你想做的事——向元素 ResourceDictionaries 添加条目。

namespace SilverlightApplication1.Assets
{
public class Utils : DependencyObject
{
public static readonly DependencyProperty AdditionalResourcesProperty = DependencyProperty.RegisterAttached(
"AdditionalResources", typeof(ResourceDictionary), typeof(Utils), new PropertyMetadata(null, OnAdditionalResourcesPropertyChanged));

public static ResourceDictionary GetAdditionalResources(FrameworkElement obj)
{
return (ResourceDictionary)obj.GetValue(AdditionalResourcesProperty);
}

public static void SetAdditionalResources(FrameworkElement obj, ResourceDictionary value)
{
obj.SetValue(AdditionalResourcesProperty, value);
}

private static void OnAdditionalResourcesPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
FrameworkElement element = d as FrameworkElement;
if (element == null)
return;

ResourceDictionary oldValue = e.OldValue as ResourceDictionary;
if (oldValue != null)
{
foreach (DictionaryEntry entry in oldValue)
{
if (element.Resources.Contains(entry.Key) && element.Resources[entry.Key] == entry.Value)
element.Resources.Remove(entry.Key);
}
}

ResourceDictionary newValue = e.NewValue as ResourceDictionary;
if (newValue != null)
{
foreach(DictionaryEntry entry in newValue)
{
element.Resources.Add(entry.Key, entry.Value);
}
}
}
}
}

它的用法与您已经尝试过的非常相似:

<Style TargetType="StackPanel">
<Setter Property="assets:Utils.AdditionalResources">
<Setter.Value>
<ResourceDictionary>
<Style TargetType="Button">
<Setter Property="Margin" Value="20" />
</Style>
</ResourceDictionary>
</Setter.Value>
</Setter>
</Style>

关于c# - Silverlight 而非 WPF 中嵌套样式(如 CSS)的挂件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21230702/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com