سؤال

أنا أحاول تعديل النمط الافتراضي ContextMenu في WPF.

عادة يمكنك أن يخلق نسخة من التقصير في التعبير مزيج باستخدام عنصر تحكم تحرير أجزاء (قالب) > تحرير نسخة خيار القائمة.ومع ذلك لا أستطيع معرفة كيف أفعل هذا مع ContextMenu.أي فكرة كيف يمكنني الحصول على النمط الافتراضي لتعديل?

أنا أحاول أن تعطيل الجانب الأيسر من قائمة السياق حيث الرموز تظهر عادة.

وذلك بفضل!

تحديث: ربما لم أكن واضحا حول إزالة الرموز.على سبيل المثال, إذا كان لديك قائمة السياق مع الرموز ثم كل الأيسر من القائمة هو مساحة مهدرة.أود أن تعديل النمط الافتراضي من قائمة السياق الخلفية لإزالة هذا.ببساطة أنا لا أعرف كيفية الوصول إلى هذا النمط الافتراضي.

هل كانت مفيدة؟

المحلول

القوالب والأنماط التي لا يمكن الوصول إليها من خلال التعبير واجهة (مثل ContextMenu قالب) يمكنك استخدام التعليمات البرمجية التالية إلى استخراج القالب:

Dim sb As System.Text.StringBuilder = New System.Text.StringBuilder
Using Writer As TextWriter = New StringWriter(sb)
    System.Windows.Markup.XamlWriter.Save(ContextMenu.Template, Writer)
End Using
Debug.Write(sb.ToString)

أو في C#

var str = new StringBuilder();
using (var writer = new StringWriter(str))
    XamlWriter.Save(ContextMenu.Template, writer);
Debug.Write(str);

نصائح أخرى

لقد وجدت طريقة سهلة للحصول على ContextMenu القالب في مزيج:

  1. أضفت ContextMenu إلى زر مع بعض menuitems.
  2. تحت عنوان "متفرقات" في الجزء خصائص ، هناك تجميع البند ContextMenu.
  3. فتح هذا.ستجد النمط المعتاد و خصائص قالب.
  4. انقر فوق مربع القائمة المنبثقة وحدد تحويله إلى مورد جديد...

هذا هو.اختيار المكان الذي تريد القالب/النمط إلى أن توضع والانتهاء من ذلك.

هنا هو توصيف كان:

<StackPanel x:Name="LayoutRoot">
    <Button Content="Click for ContextMenu" Width="30" HorizontalAlignment="Center" VerticalAlignment="Center">
        <Button.ContextMenu>
            <ContextMenu Template="{DynamicResource ContextMenuControlTemplate1}" Style="{DynamicResource ContextMenuStyle1}">
                <MenuItem Header="File"/>
                <MenuItem Header="Edit"/>
                <MenuItem Header="View"/>
                <MenuItem Header="Recent Files"/>
                    <MenuItem Header="file1.txt"/>
                    <MenuItem Header="file2.txt"/>
            </ContextMenu>
        </Button.ContextMenu>
    </Button>
</StackPanel>

ونمط/قالب حصلت على:

<Style x:Key="ContextMenuStyle1" TargetType="{x:Type ContextMenu}">
    <Setter Property="Background" Value="{DynamicResource MenuBackgroundBrush}"/>
    <Setter Property="BorderThickness" Value="1"/>
    <Setter Property="BorderBrush" Value="{DynamicResource WindowBorderBrush}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Border Uid="Border_93">
                    <Border.Style>
                        <Style TargetType="{x:Type Border}">
                            <Setter Property="Tag" Value="{DynamicResource {x:Static SystemParameters.DropShadowKey}}"/>
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Tag, RelativeSource={RelativeSource Self}}" Value="True">
                                    <Setter Property="Background" Value="Transparent"/>
                                    <Setter Property="Padding" Value="0,0,5,5"/>
                                    <Setter Property="Effect">
                                        <Setter.Value>
                                            <DropShadowEffect BlurRadius="4" Opacity="0.8" ShadowDepth="1"/>
                                        </Setter.Value>
                                    </Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </Border.Style>
                </Border>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

ويساعد هذا الأمل.في المعتاد MS الدقة ، فرش في النمط الافتراضي لم يتم العثور عليها.:)

جرب هذا:(ضع هذا الكود في الموارد الخاصة بك جزء من XAML) هذا يجب إزالة شريط الرموز من قائمة السياق.

<Style TargetType="{x:Type ContextMenu}">
    <Setter Property="OverridesDefaultStyle" Value="True" />
    <Setter Property="SnapsToDevicePixels" Value="True" />
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type ContextMenu}">
                <Border BorderThickness="1" CornerRadius="4" BorderBrush="Black" x:Name="Border" Background="White">
                    <StackPanel ClipToBounds="True" Orientation="Vertical" IsItemsHost="True" />
                </Border>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="Border" Property="Background" Value="White" />
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

في الواقع الفضاء ليست جزءا من ContextMenu هو جزء من MenuItem.حتى مجرد سحب MenuItem إلى الإطار الخاص بك في مزيج التعبير و إنشاء نسخة من السيطرة.أن ContextMenu الإعلان كما يلي

 <ContextMenu  >
    <MenuItem Header="Copy"/>
    <MenuItem Header="Paste"/>
    <MenuItem Header="Clear"/>
 </ContextMenu>

و داخل MenuItem ControlTemplate تستطيع أن ترى في الفضاء كما رفع الصوت عاليا.لذلك إزالة رمز العمود الأول من شبكة أنا ملحوظ في لقطة الشاشة.

alt text

مساحة إضافية على اليسار يرجع إلى القليل علامة الاختيار التي تظهر عند تعيين IsCheckable و IsChecked إلى true على MenuItem.

علامة الاختيار في قالب MenuItem حتى إذا قمت بتحرير التي يمكنك القيام بها.

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