وبف:كيفية تصميم أو تعطيل قائمة السياق الافتراضية لـ TextBox

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

  •  08-06-2019
  •  | 
  •  

سؤال

من الواضح أنه عندما يقوم المستخدمون بالنقر بزر الماوس الأيمن فوق تطبيق WPF الخاص بنا، ويستخدمون سمة Windows Classic، فإن قائمة السياق الافتراضية لمربع النص (التي تحتوي على النسخ والقص واللصق) لها خلفية سوداء.

أعلم أن هذا يعمل جيدًا:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

  <TextBox ContextMenu="{x:Null}"/>

</Page>

لكن هذا لا يعمل:

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">

<Page.Resources>

 <Style x:Key="{x:Type TextBox}" TargetType="{x:Type TextBox}">
   <Setter Property="ContextMenu" Value="{x:Null}"/>
</Style>
</Page.Resources>

  <TextBox/>
</Page> 

هل يعرف أحد كيفية تصميم أو تعطيل قائمة السياق الافتراضية لجميع مربعات النص في WPF؟

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

المحلول 3

نظرًا لتقرير خطأ متأخر، اكتشفنا أنه لا يمكننا استخدام ApplicationComands Cut Paste and Copy مباشرة في تطبيق موثوق به جزئيًا.ولذلك، فإن استخدام هذه الأوامر في أي أمر من عناصر التحكم الخاصة بك لن يفعل شيئًا على الإطلاق عند تنفيذه.

لذا، في جوهر الأمر، كانت إجابة براد موجودة تقريبًا، ومن المؤكد أنها بدت بالطريقة الصحيحة، أي.لا توجد خلفية سوداء ولكن لم تحل المشكلة.

قررنا "إزالة" القائمة بناءً على إجابة براد، كما يلي:

<ContextMenu x:Key="TextBoxContextMenu" Width="0" Height="0" />

واستخدم قائمة السياق الفارغة هذه كما يلي:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>

نصائح أخرى

لتصميم قائمة السياق لجميع مربعات النص، سأفعل شيئًا مثل ما يلي:

أولاً، في قسم الموارد، قم بإضافة قائمة السياق التي تخطط لاستخدامها كقائمة سياق قياسية في مربع نص.
على سبيل المثال

<ContextMenu x:Key="TextBoxContextMenu" Background="White">
  <MenuItem Command="ApplicationCommands.Copy" />
  <MenuItem Command="ApplicationCommands.Cut" />
  <MenuItem Command="ApplicationCommands.Paste" />
</ContextMenu>

ثانيًا، قم بإنشاء نمط لمربعات النص الخاصة بك، والذي يستخدم مورد قائمة السياق:

<Style TargetType="{x:Type TextBox}">
  <Setter Property="ContextMenu" Value="{StaticResource TextBoxContextMenu}" />
</Style>

وأخيرا، استخدم مربع النص الخاص بك كالمعتاد:

<TextBox />

إذا كنت تريد بدلاً من ذلك تطبيق قائمة السياق هذه على بعض مربعات النص الخاصة بك فقط، فلا تقم بإنشاء النمط أعلاه، وأضف ما يلي إلى علامة TextBox الخاصة بك:

<TextBox ContextMenu="{StaticResource TextBoxContextMenu}" />

أتمنى أن يساعدك هذا!

غريب. ContextMenu="{x:Null}" لا تفعل الخدعة.

لكن هذا يفعل:

<TextBox.ContextMenu>
    <ContextMenu Visibility="Collapsed">
    </ContextMenu>
</TextBox.ContextMenu>

حاول إزالة السمة x:Key من مورد النمط، مع ترك TargetType.أعلم أنه من المفترض أن يكون لديك x:Key لمورد ما، ولكن إذا كان لديك مع TargetType الخاص بك، فإن المفتاح هو الذي يسود.

فيما يلي نموذج للنمط الذي أستخدمه في مشروع لتنسيق جميع تلميحات الأدوات في أحد تطبيقاتي (هذا موجود في App.Resources--إشعار، بدون مفتاح)

 <Style
    TargetType="{x:Type ToolTip}">
    <Setter
      Property="Template">
      <Setter.Value>
        <ControlTemplate
          TargetType="{x:Type ToolTip}">
          <Grid
            Width="{TemplateBinding Width}"
            Height="{TemplateBinding Height}">
            <Rectangle
              RadiusX="9"
              RadiusY="9"
              Stroke="LightGray"
              StrokeThickness="2">
              <Rectangle.Fill>
                <RadialGradientBrush>
                  <GradientStop />
                  <GradientStop
                    Color="FloralWhite"
                    Offset="0" />
                  <GradientStop
                    Color="Cornsilk"
                    Offset="2" />
                </RadialGradientBrush>
              </Rectangle.Fill>
            </Rectangle>
            <ContentPresenter
              Margin="6 4 6 4" />
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

لا يهم، إذا لم تقم بتوفير مفتاح، فإنه سيتم استخدام TargetType كمفتاح بنفس الطريقة التي يستخدمها المثال الخاص بي :)

مأخوذة من MSDN على النمط:

وضع TargetType الملكية إلى TextBlock اكتب بدون تعيين x:Key يحدد ضمنا x:Key ل {x:Type TextBlock}.وهذا يعني أيضًا أنه إذا قمت > > بإعطاء النمط أعلاه x:Key قيمة أي شيء آخر غير {x:Type TextBlock}, ، لن يتم تطبيق النمط على جميع عناصر TextBlock تلقائيًا.بدلاً من ذلك ، تحتاج إلى تطبيق النمط على TextBlock العناصر صراحة

http://msdn.microsoft.com/en-us/library/system.windows.style.targettype.aspx

هذه هي الطريقة التي أستخدمها دائمًا:

      <TextBox x:Name="MyTextbox">
         <TextBox.ContextMenu>
         <ContextMenu Visibility="Hidden"/>
         </TextBox.ContextMenu>
      </TextBox>

ويمكن أيضًا استخدام:

       MyTextbox.ContextMenu.Visibility = Visibility.Hidden;
       MyTextbox.ContextMenu.Visibility = Visibility.Visble;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top