كيف أقوم بإنشاء MenuHeaders مخصصة في WPF باستخدام المسرعات؟

StackOverflow https://stackoverflow.com/questions/59456

سؤال

أرغب في إنشاء بعض رؤوس القوائم المخصصة في WPF حتى أتمكن (على سبيل المثال) من الحصول على رمز ونص في عنصر القائمة.

عادةً باستخدام MenuItems، إذا قمت بملء حقل الرأس بنص مستقيم، فيمكنك إضافة مُسرِّع باستخدام الشرطة السفلية.على سبيل المثال، _ملف

ومع ذلك، إذا أردت وضع UserControl، أعتقد أن هذه الوظيفة ستتعطل، كيف يمكنني أن أفعل شيئًا مشابهًا لما يلي؟

<Menu>
<MenuItem>
    <MenuItem.Header>
    <UserControl>
        <Image Source="..." />
        <Label Text="_Open" />
    </UserControl>
    </MenuItem.Header>
</MenuItem>
...
هل كانت مفيدة؟

المحلول

أعتقد أن خاصية Icon تناسب احتياجاتك.
ومع ذلك، للإجابة على السؤال الأصلي، من الممكن الاحتفاظ بوظيفة المسرّع عند إنشاء محتوى عنصر القائمة الخاص بك. إذا كان لديك محتوى متداخل في MenuItem، فأنت بحاجة إلى تحديد خاصية AccessText بشكل صريح كما هو الحال في أول واحد أدناه.عند استخدام النموذج المضمن، يتم الاهتمام بذلك تلقائيًا.

 <Menu> 
   <MenuItem>
      <MenuItem.Header>
        <StackPanel Orientation="Horizontal">
          <Image Source="Images/Open.ico" />      
          <AccessText>_Open..</AccessText>
        </StackPanel>
      </MenuItem.Header>
    </MenuItem>
    <MenuItem Header="_Close" />
   </Menu>

نصائح أخرى

تكمن المشكلة في أنك وضعت الصورة داخل محتوى MenuHeader مما يعني أنك ستفقد مفتاح التسريع.إذا كنت تحاول فقط الحصول على صورة في رأس القائمة، فقم بما يلي.

<MenuItem Header="_Open">
  <MenuItem.Icon>
    <Image Source="images/Open.png"/>
  </MenuItem.Icon>
</MenuItem>

إذا كنت تريد تخصيص الشكل والمظهر بشكل أكبر، فقم بتعديل com.controltemplate وأسلوب القائمة.من خلال الخبرة، يعد تصميم القوائم وعناصر القائمة أكثر صعوبة من تصميم عناصر التحكم الأخرى في WPF.

في البداية، قد تعتقد أن خاصية Icon يمكن أن تحتوي على صورة فقط.لكنها في الواقع يمكن أن تحتوي على أي شيء!لقد اكتشفت هذا عن طريق الصدفة عندما حاولت برمجيًا تعيين خاصية الصورة مباشرة إلى سلسلة تحتوي على المسار إلى الصورة.وكانت النتيجة أنها لم تظهر الصورة بل النص الفعلي للمسار!ثم اكتشفت أنه كان علي إنشاء عنصر صورة أولاً وتعيينه على خاصية Icon.يقودني هذا إلى الاعتقاد بأن خاصية الصورة كانت مجرد أي حاوية محتوى موجودة في منطقة الأيقونة على يسار القائمة، وكنت على حق.حاولت وضع زر هناك، وعملت!

يظهر هذا زرًا يحتوي على النص "i" في منطقة الرمز بعنصر القائمة.عند النقر فوق الزر، يتم تشغيل الحدث Button_Click (لا يتم تشغيل LanguageMenu_Click عند النقر فوق الزر).

<MenuItem Name="LanguageMenu" Header="_Language" Click="LanguageMenu_Click">
  <MenuItem.Icon>
    <Button Click="Button_Click">i</Button>
  </MenuItem.Icon>
</MenuItem>

يؤدي هذا إلى بديل لعدم الاضطرار إلى إنشاء صورة للأيقونة، ولكن استخدم نصًا بخط رمز بدلاً من ذلك لعرض "رمز" بسيط.يستخدم المثال التالي الخط Wingdings الذي يحتوي على رمز القرص المرن.يتم تعيين هذا الرمز الموجود في الخط إلى الحرف <, ، والتي لها معنى خاص في XAML، لذلك يتعين علينا استخدام النسخة المشفرة &lt; بدلاً من.هذا يعمل مثل الحلم!يظهر ما يلي رمز القرص المرن كرمز في عنصر القائمة:

<MenuItem Name="mnuFileSave" Header="Save" Command="ApplicationCommands.Save">
  <MenuItem.Icon>
    <Label VerticalAlignment="Center" HorizontalAlignment="Center" 
           FontFamily="Wingdings">&lt;</Label>
  </MenuItem.Icon>                
</MenuItem>

@a7an:اه، لم ألاحظ خاصية Icon من قبل.هذه بداية جيدة.

ومع ذلك، أردت على وجه التحديد إضافة "زر" إضافي إلى بعض عناصر القائمة حتى أتمكن من الحصول على ميزة "التثبيت" (راجع قائمة المستندات التي تم تحميلها مؤخرًا في Office 2007 للتعرف على فكرة الميزة).

نظرًا لأنه يجب أن يكون هناك رمز أيضًا، فهل سأحتاج على الأرجح إلى تصنيف عنصر التحكم في فئة فرعية وإضافة رمز للزر؟(لست خائفًا من العبث بقالب MenuItem، لقد اضطررت بالفعل إلى القيام بذلك مرة واحدة وسأفعل ذلك مرة أخرى إذا اضطررت لذلك!);)))

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top