18

私ができるようにするWPFのマークアップ拡張機能を作成しました

<!-- Generic Styles -->
<Style x:Key="bold" TargetType="Label">
    <Setter Property="FontWeight" Value="ExtraBold" />
</Style>

<Style x:Key="italic" TargetType="Label">
    <Setter Property="FontStyle" Value="Italic" />
</Style>

<Style x:Key="gridHeader" TargetType="Label" 
    BasedOn="{WPF:CombiStyle bold italic }" >

これは非常に便利な拡張機能であり、実行時にうまく機能します。ただし、設計時に適用されたスタイルが表示されないか、太字と斜体のタイプを間違えると、それらが StaticResources として見つからない可能性があります。

これを機能させるためにできるハックはありますか?

拡張機能のソースコードは

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Markup;

namespace MarkupExtensions
{
    [MarkupExtensionReturnType(typeof(Style))]
    public class CombiStyleExtension : MarkupExtension
    {

        private string[] MergeStyleProviders { get; set; }

        public CombiStyleExtension(string s0)
        { 
            MergeStyleProviders = s0.Split(new[]{' '});
        }

        public override object ProvideValue(IServiceProvider
                                            serviceProvider)
        {
            return MergeStyleProviders
                .Select(x => StringToStyle(serviceProvider, x))
                .Aggregate(new Style(), RecursivelyMergeStyles);
        }

        private static Style StringToStyle(IServiceProvider serviceProvider, string x)
        {
            var style = new StaticResourceExtension() { ResourceKey = x }.ProvideValue(serviceProvider) as Style;
            if (style==null)
            {
                throw new ArgumentException("Argument could not be converted to a style");
            }
            return style;
        }

        private static Style RecursivelyMergeStyles(Style accumulator,
                                           Style next)
        {
            if (next.BasedOn != null)
            {
                RecursivelyMergeStyles(accumulator, next.BasedOn);
            }

            MergeStyle(accumulator, next);

            return accumulator;
        }

        private static void MergeStyle(Style targetStyle, Style sourceStyle)
        {
            targetStyle.TargetType = sourceStyle.TargetType;
            // Merge the Setters...
            foreach (var setter in sourceStyle.Setters)
                targetStyle.Setters.Add(setter);

            // Merge the Triggers...
            foreach (var trigger in sourceStyle.Triggers)
                targetStyle.Triggers.Add(trigger);
        }

    }
}
4

2 に答える 2

0

いいえ 残念ながら、問題についての私の理解は次のとおりです。

依存関係プロパティのため、WPF では設計時の解決が機能しているようです。は依存オブジェクトから派生していないためMarkupExtension、設計時に拡張機能が評価されることはありません。天気に関しては、これは見落としか、意図的なものかについては議論の余地があります。

これを解決する別の方法があるかもしれませんが、それは少し異なります。MergeStyles という新しい添付プロパティを作成します。そのプロパティで、マージして適用するスタイル名を指定できます。値が変更されたら、上記のコードを使用して添付ファイルのスタイルを更新するだけです。マージされる各スタイルの位置を使用して、階層を決定できます。

それはまさにあなたが望むものではありませんが、それはあなたをそこに導くかもしれません. これの結果は、バインドできるということです。

于 2013-04-17T11:53:30.423 に答える