どのように書き込みマークアップ拡張機能MarkupExtension WPFに、でもそれは中のControlTemplate / DataTemplateの中に効果を取ることができます

WPFのためのWPFのマークアップ拡張は、強力な拡張性をもたらします。自己定義マークアップ拡張機能を使用して、我々だけではなく、それのいくつかは自分だ、XAMLでプロパティ値の種類の多種多様を提供することができます。

しかし、そこに発見の小さなパートナーはあるControlTemplateか、DataTemplateマークアップ拡張機能を書き、時々仕事はしていませんが、この記事では、ソリューションを提供します。


:この記事では、関連する知識を理解したいならば、私は公式サイト読書をお勧めします、WPFマークアップ拡張を作成する方法を詳細に説明していないマイクロソフトドキュメントに-マークアップ拡張機能とWPF XAMLを

シンプルなマークアップ拡張機能を書きます

シンプルなマークアップ拡張機能は、このようなものになるだろう。

using System.Windows;
using System.Windows.Markup;
using System.Windows.Media;

namespace Walterlv.Demo
{
    public class RevealBorderBrushExtension : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            return Brushes.White;
        }
    }
}

このマークアップ拡張機能を使用すると、任意のXAMLで使用することができるように簡単です。長いプロパティが割り当て受理されるとBrush種類を、あなたは間違って行くことはできません。

しかし......、より複雑なマークアップ拡張機能、またでマークされた拡張書くための小さなパートナーがありserviceProvider、ターゲットコントロールのプロパティの一部を取得するには。良い仕事して、この日マークの結果は、拡張子が使用されていたControlTemplate、その後、ハングアップが...... ......ハングアップ

書き込むことができますControlTemplateで使用されるマークアップ拡張

ではControlTemplate、中央、XAMLマークアップ拡張機能がどの手段ときのマークアップ拡張することを、すぐに実装されProvideValue、実装、テンプレートに基づく制御は、それが何であるかを作成するには、まだ作成されていませんか?

命名されSystem.Windows.SharedDpたオブジェクト、何であるか理解していませんか?それは問題では、マイクロソフトは、このクラスに設定されていないinternal、とちょうどあなたが知っている必要はありません。私たちが実際にコントロール機能マークアップ拡張機能のいくつかを使用する必要があるのであれば、(このようなイベントをサブスクライブする必要があるとして、バインドする必要性を、あなたは......レイアウトを取得する必要があります)、あなたはする必要があるSystem.Windows.SharedDpと判断します。

具体的には、このような判断を含めます。

if (service.TargetObject.GetType().Name.EndsWith("SharedDp"))
{
    return this;
}

書き出され、より完全に少しは、それがこれです:

using System;
using System.ComponentModel;
using System.Windows;
using System.Windows.Input;
using System.Windows.Markup;
using System.Windows.Media;

namespace Walterlv.Demo
{
    public class RevealBorderBrushExtension : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            // 如果没有服务,则直接返回。
            if (!(serviceProvider.GetService(typeof(IProvideValueTarget)) is IProvideValueTarget service)) return null;
            // MarkupExtension 在样式模板中,返回 this 以延迟提供值。
            if (service.TargetObject.GetType().Name.EndsWith("SharedDp")) return this;
            // 如果不是 FrameworkElement,那么返回 this 以延迟提供值。
            if (!(service.TargetObject is FrameworkElement element)) return this;
            // 如果是设计时,那么返回白色
            if (DesignerProperties.GetIsInDesignMode(element)) return Brushes.White;

            var window = Window.GetWindow(element);
            if (window == null) return this;
            // 这一句是编译不通过的,我只是拿来做示范。
            var brush = CreateBrush(window, element);
            return brush;
        }
    }
}

あなたは私の他のブログの記事を読むことができるような感じがある場合は、このコードで多少馴染み感じることがあります。RevealBrush、WPFの照明効果と滑らかなデザイン流暢デザインシステムは、それを達成するためにシミュレートすることができます!


私のブログはで開始されhttps://blog.walterlv.com/、および特色CSDNから解放されますが、それはめったに一度放出されない更新されます。

あなたが表示された場合は任意のは、ブログ、してください共有の内容を理解していません。私が建てDOTNET職業技術学院が参加することを歓迎します。

クリエイティブコモンズライセンス

この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。転載、使用、再投稿へようこそ、しかし陸毅によって署名記事を保つようにしてください(リンク含む:https://walterlv.blog.csdn.net/は)、商業目的のために使用してはならない、記事に基づいて作業が同一のライセンスを変更するようにしてくださいリリース。ご質問があれば、してください私に連絡

公開された420元の記事 ウォンの賞賛245 ビュー520 000 +

おすすめ

転載: blog.csdn.net/WPwalter/article/details/104101036