<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Maui | The .NET Blog</title><link>https://thedotnetblog.com/ar/tags/maui/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>ar</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Thu, 16 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/ar/tags/maui/index.xml" rel="self" type="application/rss+xml"/><item><title>تجميع الدبابيس يصل أخيراً إلى خرائط .NET MAUI — خاصية واحدة، لا ألم</title><link>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 يضيف تجميع الدبابيس الأصيلي إلى عنصر التحكم Map. خاصية واحدة، ومجموعات تجميع منفصلة، ومعالجة النقر — كل ذلك مدمج.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;تمت ترجمة هذا المقال تلقائياً. للنسخة الأصلية، &lt;a href="https://thedotnetblog.com/ar/posts/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;انقر هنا&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;تعرف تلك اللحظة حين تحمّل خريطة بمئة دبوس ويتحول كل شيء إلى كتلة غير قابلة للقراءة؟ نعم، هذا كان تجربة .NET MAUI Maps — حتى الآن. لا مزيد من ذلك.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;أعلن للتو&lt;/a&gt; أن .NET MAUI 11 Preview 3 يشحن تجميع الدبابيس جاهزاً للاستخدام على Android وiOS/Mac Catalyst. والجزء الأفضل — تفعيله سهل بشكل مدهش.&lt;/p&gt;
&lt;h2 id="خاصية-واحدة-لحكمهم-جميعا"&gt;خاصية واحدة لحكمهم جميعاً&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;maps:Map&lt;/span&gt; &lt;span class="na"&gt;IsClusteringEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;هذا كل شيء. تُجمَّع الدبابيس القريبة في مجموعات مع شارة العدد. قرّب الخريطة وتتمدد. ابتعد وتنضمّ. هذا النوع من السلوك الذي يتوقعه المستخدمون من أي خريطة حديثة — والآن تحصل عليه بخاصية واحدة.&lt;/p&gt;
&lt;h2 id="مجموعات-تجميع-مستقلة"&gt;مجموعات تجميع مستقلة&lt;/h2&gt;
&lt;p&gt;هنا تصبح الأمور مثيرة للاهتمام. ليس كل الدبابيس يجب أن تتجمع معاً. المقاهي والحدائق أشياء مختلفة، ويجب أن تعرف خريطتك ذلك.&lt;/p&gt;
&lt;p&gt;خاصية &lt;code&gt;ClusteringIdentifier&lt;/code&gt; تتيح لك فصل الدبابيس إلى مجموعات مستقلة:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Occidental Square&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3325&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;parks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;الدبابيس ذات المعرّف نفسه تتجمع معاً. المعرّفات المختلفة تُشكّل مجموعات مستقلة حتى عند التقارب الجغرافي. لا معرّف؟ المجموعة الافتراضية. واضح ومتوقع.&lt;/p&gt;
&lt;h2 id="معالجة-النقر-على-المجموعة"&gt;معالجة النقر على المجموعة&lt;/h2&gt;
&lt;p&gt;حين ينقر مستخدم على مجموعة، تحصل على حدث &lt;code&gt;ClusterClicked&lt;/code&gt; بكل ما تحتاجه:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClusterClicked&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;$&amp;#34;Cluster ({e.Pins.Count} pins)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Suppress default zoom-to-cluster behavior:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// e.Handled = true;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;تمنحك وسيطات الحدث &lt;code&gt;Pins&lt;/code&gt; (الدبابيس في المجموعة)، و&lt;code&gt;Location&lt;/code&gt; (المركز الجغرافي)، و&lt;code&gt;Handled&lt;/code&gt; (اضبطها على &lt;code&gt;true&lt;/code&gt; إذا أردت تجاوز التكبير الافتراضي). بسيط، عملي، تماماً ما تتوقعه.&lt;/p&gt;
&lt;h2 id="تفاصيل-المنصة-تستحق-المعرفة"&gt;تفاصيل المنصة تستحق المعرفة&lt;/h2&gt;
&lt;p&gt;على Android، يستخدم التجميع خوارزمية شبكية مخصصة تُعيد الحساب عند تغيّر مستوى التكبير — دون تبعيات خارجية. على iOS وMac Catalyst، يستفيد من دعم &lt;code&gt;MKClusterAnnotation&lt;/code&gt; الأصيل في MapKit، مما يعني حركات انتقال سلسة وأصيلة للمنصة.&lt;/p&gt;
&lt;p&gt;هذه إحدى الحالات التي اتخذ فيها فريق MAUI القرار الصحيح — الاتكاء على المنصة حيث يكون ذلك منطقياً.&lt;/p&gt;
&lt;h2 id="لماذا-يهم-هذا"&gt;لماذا يهمّ هذا&lt;/h2&gt;
&lt;p&gt;تجميع الدبابيس كان أحد أكثر الميزات المطلوبة في .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;المشكلة #11811&lt;/a&gt;)، ولسبب وجيه. كل تطبيق يعرض مواقع على خريطة — تتبع التوصيل، ومحدّدات المتاجر، والعقارات — يحتاج إلى هذا. سابقاً كان عليك بناؤه بنفسك أو استيراد مكتبة من جهة خارجية. الآن هو مدمج.&lt;/p&gt;
&lt;p&gt;لنا نحن مطوّري .NET الذين نبني تطبيقات جوالة متعددة المنصات، هذا هو نوع تحسينات جودة الحياة الذي يجعل MAUI خياراً عملياً حقيقياً للسيناريوهات المكثفة باستخدام الخرائط.&lt;/p&gt;
&lt;h2 id="ابدأ-الآن"&gt;ابدأ الآن&lt;/h2&gt;
&lt;p&gt;ثبّت &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; وحدّث حمل عمل .NET MAUI. &lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;نموذج Maps&lt;/a&gt; يتضمن صفحة Clustering جديدة يمكنك تجربتها مباشرةً.&lt;/p&gt;
&lt;p&gt;ابنِ شيئاً به — واترح خرائطك أخيراً.&lt;/p&gt;</content:encoded></item></channel></rss>